При добавлении объектов в свойства NSMutableArray происходит сбой с нераспознанным селектором?

Я получаю «-[__NSArrayI addObject:]: нераспознанный селектор отправлен в экземпляр 0x10dd15ee0» здесь, когда я пытаюсь добавить объект в NSMutableArray. Я не уверен, почему.

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

Я хочу иметь возможность обновлять один бой в боях, оставляя остальные бои в покое. Здесь я нахожу коврик, на который мне нужно назначить бой. Если он не инициализирован, я его инициализирую. Потом, если он пустой, пытаюсь добавить в него новый бут, а он вылетает.

Разве я не могу изменить элементы 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.ч:

#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

person Adam    schedule 12.05.2012    source источник
comment
Введите po 0x10dd15ee0 в отладчике, чтобы увидеть, какой объект отправляется не тому селектору.   -  person fannheyward    schedule 12.05.2012
comment
Я вижу, что проблема в том, что у меня для свойства боев установлено значение «копировать», что дает мне неизменяемую копию, которая не знает метод addObject: я изменил его обратно на сильный, как и другие мои свойства, но я не уверен, какой хаос это может нанести моему заявлению. Как я могу управлять изменяемыми массивами, доступ к которым осуществляется из нескольких экземпляров других классов. Это будет кошмар?   -  person Adam    schedule 12.05.2012


Ответы (3)


Это ваша проблема:

@property (copy, nonatomic) NSMutableArray* bouts; 

Параметр "copy" создает неизменяемую копию массива, что означает, что при выполнении этой строки:

NSMutableArray* oldBouts = [mat bouts];

На самом деле вы получаете обычный NSArray, поэтому вы получаете ошибку нераспознанного селектора.

Простое решение этой проблемы — изменить ключевое слово «копировать» на «сильное». Чуть сложнее было бы оставить его как копию, а вместо этого изменить тип свойства на NSArray, хотя это усложнило бы изменение массива.

Наконец, вы можете сделать свою собственную реализацию setBouts:, которая делает копию, используя метод -mutableCopy, чтобы убедиться, что копия может быть изменена.

person grahamparks    schedule 12.05.2012

Я думаю, все дело в вашем NSMutableArray* oldBouts = [mat bouts]; Распредели его, и посмотри, что будет.

person Dream.In.Code    schedule 12.05.2012

попробуйте инициализировать свойства с помощью @dynamic. Вам может помочь очень похожий ответ.

person zahreelay    schedule 12.05.2012