我得到“ - [__ NSArrayI addObject:]:无法识别的选择器发送到实例0x10dd15ee0”这里,当我尝试将addObject添加到NSMutableArray时。我不确定为什么。
我有一组嵌套的自定义类。 WTEvent有一个名为mats的NSMutableArray属性,它由WTMat对象组成。 mats有一个名为bouts的WTBout对象的NSMutableArray。
我希望能够在比赛中更新一回合,同时单独留下剩下的比赛。在这里,我找到了我需要分配一个回合的垫子。如果没有初始化,我会初始化它。然后,如果它是空的,我会尝试向它添加一个newBout,然后崩溃。
我不应该像这样更改NSMutableArray的元素吗?
// Locate the correct mat
WTMat* mat = [self getMatFromBoutKey:[updateData valueForKey:@"boutKey"]];
WTBout* newBout = [WTBout buildBoutFromDictionary:updateData];
// need to initialize bouts
if ([mat bouts] == nil) {
NSLog(@"Initializing bouts");
NSMutableArray* newBouts = [[NSMutableArray alloc] init ];
[mat setBouts:newBouts];
}
if ([[mat bouts] count]) {
// if bouts has bouts, then adjust the bout stack
NSLog(@"bouts is not empty");
} else {
// if bouts is empty, just add a bout
NSLog(@"Adding a newBout");
NSMutableArray* oldBouts = [mat bouts];
NSLog(@"oldbouts: %@", [oldBouts description]);
[oldBouts addObject:newBout]; // -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0
}
WTMat.h:
#import <Foundation/Foundation.h>
@interface WTMat : NSObject
{
NSString* matName;
NSString* boutKey;
NSString* multicastAddress;
NSMutableArray* bouts;
}
@property (strong, nonatomic) NSString* matName;
@property (strong, nonatomic) NSString* boutKey;
@property (strong, nonatomic) NSString* multicastAddress;
@property (copy, nonatomic) NSMutableArray* bouts;
@end
日志:
2012-05-12 08:14:00.491 Wrestling Tools[12623:403] Initializing bouts
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] Adding a newBout
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] oldbouts: (
)
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0
2012-05-12 08:14:00.492 Wrestling Tools[12623:403] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x10dd15ee0
2012-05-12 08:14:00.494 Wrestling Tools[12623:403] (
0 CoreFoundation 0x00007fff96783fc6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff92375d5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff968102ae -[NSObject doesNotRecognizeSelector:] + 190
3 CoreFoundation 0x00007fff96770e73 ___forwarding___ + 371
4 CoreFoundation 0x00007fff96770c88 _CF_forwarding_prep_0 + 232
5 Wrestling Tools 0x000000010dc49343 -[WTUpdater fullUpdate:] + 835
答案 0 :(得分:5)
这是你的问题:
@property (copy, nonatomic) NSMutableArray* bouts;
“copy”参数生成数组的不可变副本,这意味着该行运行时:
NSMutableArray* oldBouts = [mat bouts];
你实际上得到了一个普通的NSArray
,这就是你得到无法识别的选择器错误的原因。
对此的简单解决方案是将“copy”关键字更改为“strong”。稍微更难的是将它保留为副本,而是将属性的类型更改为NSArray,尽管这会使修改数组变得复杂。
最后,你可以自己实现setBouts:
,它使用-mutableCopy
方法进行复制,以确保它所做的副本是可变的。
答案 1 :(得分:0)
我认为这完全是关于你的NSMutableArray* oldBouts = [mat bouts];
Alloc它,看看会发生什么。
答案 2 :(得分:-1)
尝试使用@dynamic初始化属性。 very similar answer可以帮助您。