0

当我尝试将对象添加到NSMutableArray时,我得到“ - [__ NSArrayI addObject:]:发送到实例0x10dd15ee0的无法识别的选择器”。我不知道为什么。添加对象到NSMutableArray属性崩溃与无法识别的选择器?

我有一组嵌套的自定义类。 WTEvent有一个名为mats的NSMutableArray属性,它由WTMat对象组成。垫子有一个名为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

在调试器中键入'po 0x10dd15ee0'来查看哪个对象正在发送错误的选择器。 – fannheyward

+0

我看到的问题是我将bouts属性设置为'copy',这给了我一个不可变的副本,它不知道方法addObject:我已经将它改回为强壮,就像我的其他属性一样,我不知道这会对我的应用程序造成什么样的破坏。我如何管理从其他类的多个实例访问的可变数组。这会是一场噩梦吗? – Adam

回答

5

这是你的问题:

@property (copy, nonatomic) NSMutableArray* bouts; 

“复制”参数使得阵列的不变副本,当这条线运行,这意味着:

NSMutableArray* oldBouts = [mat bouts]; 

你实际上得到一个普通的NSArray,这就是为什么你得到无法识别的选择器错误。

这个简单的解决方案是将“复制”关键字更改为“强大”。稍微难一点的是将其作为副本,而不是将属性的类型更改为NSArray,尽管这会使修改数组复杂化。

最后,你可以自己实现setBouts:,它使用-mutableCopy方法做副本,以确保它所做的副本是可变的。

0

我认为这是所有关于你NSMutableArray* oldBouts = [mat bouts];的Alloc它,看看会发生什么。

相关问题