简体   繁体   中英

Can not add more than 3 objects to a NSMutableSet

Made a custom obj called Item with some string fields and one float.

.h
        @interface Item : NSObject {

        NSString * name;        
        NSString * artNum;      
        NSString * collection;  
        NSString * description; 

        float num;

    }

    @property (nonatomic, copy) NSString * name;
    @property (nonatomic, copy) NSString * artNum;
    @property (nonatomic, copy) NSString * collection;
    @property (nonatomic, copy) NSString * description;
    @property (nonatomic) float num;

- (id)initWithName:(NSString *) name_ 
         andArtNum:(NSString *) artNum_
     andCollection:(NSString *) collection_
    andDescription:(NSString *) description_
          andNum:(float)num_;
- (id) init;
- (BOOL)isEqualToItem:(Item *)anItem;
- (NSUInteger)hash;

implementation:

    #import "Item.h"


@implementation Item

@synthesize name;
@synthesize artNum;
@synthesize collection;
@synthesize description;
@synthesize num;

- (id)initWithName:(NSString *) name_ 
         andArtNum:(NSString *) artNum_
     andCollection:(NSString *) collection_
    andDescription:(NSString *) description_
          andNum:(float)num_
{
    if (self = [super init]) {
        self.name       = name_;
        self.artNum     = artNum_;
        self.collection = collection_;
        self.description= description_;
        self.num        = num_;
    }
    return self;
}

-(id)init{
    return [self initWithName:@"" 
                    andArtNum:@""        
                andCollection:@""
              andDescription :@""
                     andNum:.0];
}

- (void)dealloc {
    [name release];
    [artNum release];
    [collection release];
    [description release];
    [super dealloc];
}

- (BOOL)isEqual:(id)other {
    if (other == self)
        return YES;
    if (!other || ![other isKindOfClass:[self class]])
        return NO;
    return [self isEqualToItem:other];
}

- (BOOL)isEqualToItem:(Item *)anItem {
    if (self == anItem)
        return YES;
    if (![(id) self.name         isEqual:anItem.name])
        return NO;
    if (![(id) self.artNum       isEqual:anItem.artNum])
        return NO;
    if (![(id) self.collection   isEqual:anItem.collection])
        return NO;
    if (![(id) self.description  isEqual:anItem.description])
        return NO;
    if (!self.num == anItem.num)
        return NO;

//    if (![[self customObject] isEqualToCustomObject:[anItem customObject]])
//        return NO;
    return YES;
}

- (NSUInteger)hash {
    NSString *string4Hash = [NSString stringWithFormat:@"%@%@%@%@%f",self.name,self.artNum,self.collection,self.description,self.num];
    NSUInteger hash = [string4Hash hash];
    return hash;
}

@end

Now, I have NSMutableSet (itemsAdded which is a property of another class) inited as [[NSMutableSet alloc]init] and I can't add more than 3 Item objects to it. And BTW Items adding in very strange way...

    -(IBAction) itemAdd:(id)sender{
    NSLog(@"itemAdded");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    Item *item = [[Item alloc] initWithName:lblItemName.text
                                  andArtNum:lblItemArt.text
                              andCollection:lblItemCollection.text
                                                         andDescription:lblItemDescriprion.text
                                   andNum:random()*100];
    [self.itemsAdded addObject:item];

    NSLog(@"itemAdd: intems added count: %i",[self.itemsAdded count]);
    for (Item *it in itemsAdded){
        NSLog(@"item added num is: %f",it.num);
    }
    [pool release];
}

And this is what i get:

2012-03-28 20:22:49.479 MyApp[2493:207] itemAdded
2012-03-28 20:22:49.479 MyApp[2493:207] itemAdd: intems added count: 1
2012-03-28 20:22:49.479 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.175 MyApp[2493:207] itemAdded
2012-03-28 20:22:51.176 MyApp[2493:207] itemAdd: intems added count: 2
2012-03-28 20:22:51.176 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.176 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:51.448 MyApp[2493:207] itemAdded
2012-03-28 20:22:51.448 MyApp[2493:207] itemAdd: intems added count: 2
2012-03-28 20:22:51.448 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.448 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:51.623 MyApp[2493:207] itemAdded
2012-03-28 20:22:51.623 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:51.623 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.623 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:51.624 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:51.815 MyApp[2493:207] itemAdded
2012-03-28 20:22:51.816 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:51.816 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.816 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:51.816 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:51.991 MyApp[2493:207] itemAdded
2012-03-28 20:22:51.992 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:51.992 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:51.992 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:51.992 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:52.175 MyApp[2493:207] itemAdded
2012-03-28 20:22:52.175 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:52.175 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:52.175 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:52.176 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:52.360 MyApp[2493:207] itemAdded
2012-03-28 20:22:52.361 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:52.361 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:52.361 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:52.361 MyApp[2493:207] item added num is: -1206257280.000000
2012-03-28 20:22:52.591 MyApp[2493:207] itemAdded
2012-03-28 20:22:52.591 MyApp[2493:207] itemAdd: intems added count: 3
2012-03-28 20:22:52.592 MyApp[2493:207] item added num is: 40311868.000000
2012-03-28 20:22:52.592 MyApp[2493:207] item added num is: -335000352.000000
2012-03-28 20:22:52.592 MyApp[2493:207] item added num is: -1206257280.000000

Take a look there 2 times printed that set has 2 items but at this point there must be 3 items. It works randomly and could print it has 2 items more than 2 times. Also no reaction on adding more than 3 items at all. Only 3 items persist 4ever. Why is that? What I'm doing wrong?

If you create identical objects, only one copy will be put into the set.

This is by design. If you want multiple copies, use an array instead.

This is probably happening more than you would expect though, because you are using random and not seeding it properly. Use arc4random() % 100 (or a number even bigger than 100) if you want it to happen less often, or change some of the other variables so that the objects are not identical and you will see this problem go away.

EDIT:

Another problem that you have is this line of code:

if (!self.num == anItem.num)

In order to make the proper test, change it to:

if (self.num != anItem.num)

(Otherwise you are comparing the BOOL !self.num to the float anItem.num)

i have some remark in your code in your IBAction :

  1. First you dont need to NSAutoreleasePool and for release a pool you have to do this : [pool drain]

  2. Are you sure to declare your NSMutableSet by alloc init noramly or by alloc initWithCapacity !!

  3. i suggest you NSMutableArray

  4. Dont forhet to release you item after added in your MutableArray

i Hope that help you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM