0

Я получаю "- [__ NSArrayI addObject:]: непризнанный селектор, отправленный в экземпляр 0x10dd15ee0" здесь, когда я пытаюсь добавить Object в NSMutableArray. Я не знаю, почему.Добавление объектов в свойства NSMutableArray происходит с непризнанным селектором?

У меня есть набор пользовательских классов, которые являются вложенными. WTEvent имеет свойство NSMutableArray, называемое матами, состоящее из объектов WTMat. маты имеют объекты NSMutableArray из WTBout, называемые боями.

Я хочу, чтобы иметь возможность обновлять один бой в бою, оставив остальную часть боев. Здесь я нахожу коврик, который мне нужен, чтобы назначить бой. Если он не инициализирован, я инициализирую его. Затем, если он пуст, я пытаюсь добавить к нему 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 

Log:

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 его, и посмотреть, что произойдет.