Сделал пользовательский объект под названием Item с несколькими строковыми полями и одним 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;
реализация:
#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
Теперь у меня есть NSMutableSet (itemsAdded, который является свойством другого класса), инициализированный как [[NSMutableSet alloc] init], и я не могу добавить в него более 3 объектов Item. И, кстати, добавление предметов очень странным образом ...
-(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];
}
И вот что я получаю:
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
Взгляните, там 2 раза напечатано, что в наборе 2 предмета, но на данный момент должно быть 3 предмета. Он работает случайным образом и может напечатать 2 элемента более 2 раз. Также нет реакции на добавление более 3 предметов на всех. Только 3 предмета сохраняются 4ever.
Это почему? Что я делаю не так?