NSMutableArray addObject: – :无法识别的select器发送到实例
我已经尝试从星期天初始化我的NSMutableArray 100种方式,没有什么是为我工作。 我试图设置它等于一个新分配和初始化NSMutableArray,只是分配,初始化variables本身,我可以想到的每一个组合,总是相同的结果。
代码如下:
Object.h
NSMutableArray *array; @property (copy) NSMutableArray *array;
Object.m
@synthesize array; if ( self.array ) { [self.array addObject:anObject]; } else { self.array = [NSMutableArray arrayWithObjects:anObject, nil]; }
注意:在debugging“anObject”不是在执行时没有零…
我已经testing了anObject,它的初始化工作得很好,但是当我尝试添加addObject到self.array时,我总是得到下面的错误。
2010-07-10 11:52:55.499 MyApp [4347:1807] – [__ NSArrayI addObject:]:发送到实例0x184480的无法识别的select器
2010-07-10 11:52:55.508 MyApp [4347:1807] ***由于未捕获exception'NSInvalidArgumentException',原因:' – [__ NSArrayI addObject:]:无法识别的select器发送到实例0x184480'
有谁知道发生了什么事?
@property (copy)
的合成setter向数组发送一个copy
消息,这将产生一个不可变的副本。
Objective-C指南中详细介绍了 ,你别无select,只能在这里实现setter。
当我看到我的post的时候,发生了一个想法,我回答了我自己的问题。 这个决议很模糊,所以我决定继续,自己创buildpost并自己回答(所以像我这样的其他新手也不会挂断)。
我的错误在…
@property (copy) NSMutableArray *array;
应该是…
@property (retain) NSMutableArray *array;
这个错误并没有以我执行代码的方式发生,而是以anObject试图“复制”NSMutableArray数组的方式进行。
众所周知,
mutableArray = [mutableArray copy];
并不总是(或根据我的经验)等于…
mutableArray = [mutableArray mutableCopy];
这是我的问题的来源。 通过简单地将@property从(复制)切换到(retain)我解决了我的问题。
我想把我的帽子给乔治·弗里茨(Georg Fritzsche)。 我最终需要使用(复制)而不是(保留),而且如果没有他的input,我也不会知道该怎么做。
//@property (copy) NSMutableArray *array; @property (nonatomic, copy) NSMutableArray *array; //overridden method is non-atomic as it is coded and should be reflected here.
如果你想使用(复制)一个可变的对象,你必须重写“setter”方法,如下所示…
- (void)setArray:(NSArray *)newArray { if ( array != newArray ) { [array release]; array = [newArray mutableCopy]; // [array retain]; // unnecessary as noted by Georg Fritzsche } return; }
注意:你会得到一个编译器警告:不兼容的Objective-Ctypes初始化'结构NSArray *',期望'结构NSMutableArray *'我select声明newArray参数为(NSArray *),因为你有灵活性有任何数组传递并正确地复制到您的(NSMutableArray *)variables。 如果你想声明newArray参数为(NSMutableArray *),你仍然需要保留mutableCopy方法来获得你想要的结果。
欢呼到格奥尔格! ž@ķ!
我得到了同样的错误,即使我的属性是强大的(使用ARC),我分配数组与NSMutableArray。
发生的事情是,我正在归档可变数组(因为它包含自定义对象)以供将来使用,并且在对其进行解码时,会返回一个不可变的副本。
希望它能帮助那里的任何人。
有一些索引(到其他地方的数据数组),并希望按数字顺序(有一个很好的理由)。 崩溃,直到最后添加mutableCopy。 完全困惑,直到我记得使用Objective-C文字@ []返回一个不可变的数组 。
NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy]; NSLog(@"%@", a); [indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) { return [obj1 compare:obj2]; }]; NSLog(@"%@", a);
Thanx,Zak!
我被这个例外所困,因为我犯了一个错字,也许会救一个人5分钟。 的时间:
我写了:
NSMutableArray *names = [NSArray array];
代替:
NSMutableArray *names = [NSMutableArray array];
编译器没有问题,因为NSMutableArray也是一个NSArray,但它试图添加一个对象时崩溃。
这个错误是因为试图将一个对象添加到实际上指向一个NSArray对象的NSMutableArraytypes而产生的。 下面的一些演示代码显示了这种情况:
NSString *test = @"test"; NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; [mutableArray addObject:test]; NSArray *immutableArray = [[NSArray alloc] init]; mutableArray = immutableArray; [mutableArray addObject:test]; // Exception: unrecognized selector
从上面的代码中,很容易看出子types正被分配给超types。 例如,在Java中,这会立即被标记为错误(types之间的转换错误),并且问题很快得到解决。 为了公平地使用Objective-C,当尝试执行不兼容的赋值时会给出警告,但是这样做有时似乎不够,结果会给开发人员带来很大的痛苦。 幸运的是,这一次,不是我自己承受了这种痛苦的大部分
如果数组中的某个对象为null,则可能会发生此exception。