NSMutableArray addObject: - [__ NSArrayI addObject:]: нераспознанный селектор отправляется в экземпляр

Я попытался инициализировать свои пути NSMutableArray 100 с воскресенья, и НИЧТО не работает на меня. Я пытался установить его равный недавно выделенному и инициализированному NSMutableArray, просто выделению, инициализируя переменную отдельно, каждая комбинация, о которой я мог думать и всегда тот же результат.

Вот код:

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];
}

Примечание: В отладке "anObject" НЕ является нолем во время выполнения...

Я протестировал anObject, и это - инициализация, работает просто великолепно, но я продолжаю получать ошибку ниже, когда я пробую к addObject: к self.array.

10.07.2010 11:52:55.499 MyApp [4347:1807] - [__ NSArrayI addObject:]: нераспознанный селектор, отправленный в экземпляр 0x184480

10.07.2010 11:52:55.508 MyApp [4347:1807] ***, Завершающее приложение из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '-[__ NSArrayI addObject:]: нераспознанный селектор, отправленный в экземпляр 0x184480'

У кого-либо есть какая-либо идея, что идет не так, как надо?

67
задан Zak 17 May 2012 в 21:09
поделиться

3 ответа

Я хотел бы снять шляпу перед Георгом Фриче. В конечном итоге мне пришлось использовать (копировать) вместо (сохранить), и я бы не знал, что делать без его участия.

//@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-C, инициализирующие 'struct NSArray * ', expected' struct NSMutableArray * 'Я решил объявить параметр newArray как (NSArray *), потому что вам предоставляется возможность передавать любой массив и правильно копировать его в вашу (NSMutableArray *) переменную. Если вы хотите объявить параметр newArray как (NSMutableArray *), вам все равно нужно оставить метод mutableCopy на месте, чтобы получить желаемые результаты.

Приветствую Георга! Z @ K!

11
ответ дан 24 November 2019 в 14:30
поделиться

Синтезированный сеттер для @property (copy) посылает copy сообщение массиву, что приводит к неизменяемой копии.

Здесь у вас нет другого выбора, кроме как реализовать сеттер самостоятельно, как подробно описано в руководстве по Objective-C.

83
ответ дан 24 November 2019 в 14:30
поделиться

Когда я проверял свой пост, у меня и у меня возникла мысль ответил на мой собственный вопрос. Это решение было достаточно неясным, поэтому я решил пойти дальше, создать сообщение и ответить на него сам (чтобы другие новички, такие как я, не повесили трубку).

Моя ошибка была в ...

@property (copy) NSMutableArray *array;

это должно было быть ...

@property (retain) NSMutableArray *array;

Ошибка произошла не в том, как я выполнял свой код, а в том, как anObject пытался "скопировать" массив NSMutableArray.

Как мы все знаем ...

mutableArray = [mutableArray copy];

не всегда (или когда-либо, по моему опыту) равно ...

mutableArray = [mutableArray mutableCopy];

И это было источником моей проблемы. Просто переключив @property с (копировать) на (сохранить), я решил свою проблему.

73
ответ дан 24 November 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: