NSMutableArray addObject: - [__ NSArrayI addObject:]: нераспознанный селектор отправлен на экземпляр - PullRequest
67 голосов
/ 10 июля 2010

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

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

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

Кто-нибудь знает, что происходит не так?

Ответы [ 9 ]

83 голосов
/ 10 июля 2010

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

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

73 голосов
/ 10 июля 2010

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

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

@property (copy) NSMutableArray *array;

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

@property (retain) NSMutableArray *array;

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

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

mutableArray = [mutableArray copy];

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

mutableArray = [mutableArray mutableCopy];

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

11 голосов
/ 10 июля 2010

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

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

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

3 голосов
/ 17 февраля 2013

Имейте некоторые индексы (в массив данных в другом месте) и хотели, чтобы они были в числовом порядке (по уважительной причине).Сбой до добавления mutableCopy в конце.Полностью озадаченный, пока я не вспомнил, что использование Objective-C literal @ [] возвращает неизменяемый массив .

NSMutableArray *a = [@[@(self.indexA), @(self.indexB)] mutableCopy];
NSLog(@"%@", a);
[indexArray sortUsingComparator: ^(NSNumber *obj1, NSNumber *obj2) {
    return [obj1 compare:obj2];
}];
NSLog(@"%@", a);

Спасибо, Зак!

3 голосов
/ 12 января 2012

Я получал ту же ошибку, хотя мои свойства были сильными (с использованием ARC), и я выделил массив с помощью NSMutableArray.

То, что происходило, было то, что я архивировал изменяемый массив (так как он содержит пользовательскиеобъекты) для использования в будущем и при декодировании возвращает неизменная копия.

Надеюсь, что это кому-нибудь поможет.

0 голосов
/ 23 апреля 2019

У меня была похожая ошибка: нераспознанный селектор, отправленный экземпляру массива NSMutable

@property (assign, nonatomic) NSMutableArray *myMutableArray;

при копировании копирую и не обращаю внимания и это вызывает проблему.

Мы решили, что я изменил его на сильный тип (вы можете изменить его на любой другой тип, например сильный / слабый и т. Д. В зависимости от ваших требований) Таким образом, решение в моем случае было:

@property (strong, nonatomic) NSMutableArray *myMutableArray;

Так что будьте осторожны при копировании! Проверьте один раз.

0 голосов
/ 30 июля 2014

Ошибка возникла в результате попытки добавить объект к типу NSMutableArray, который фактически указывал на объект NSArray. Этот тип сценария показан в следующем демонстрационном коде:

NSString *test = @"test";
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
[mutableArray addObject:test];
NSArray *immutableArray = [[NSArray alloc] init];
mutableArray = immutableArray;
[mutableArray addObject:test]; // Exception: unrecognized selector

Из приведенного выше кода легко увидеть, что типу подкласса присваивается тип суперкласса. Например, в Java это сразу же было бы помечено как ошибка (ошибка преобразования между типами), и проблема была решена довольно быстро. Чтобы быть справедливым по отношению к Objective-C, при попытке выполнить несовместимое присваивание выдается предупреждение, однако иногда этого просто не достаточно, и результат может быть настоящей болью для разработчиков. К счастью, на этот раз большую часть этой боли понесла не я: P

0 голосов
/ 03 марта 2013

Меня укусило это исключение из-за опечатки, которую я сделал, может быть, это спасет кого-то 5 минут. своего времени:

Я написал:

NSMutableArray *names = [NSArray array];

вместо:

NSMutableArray *names = [NSMutableArray array];

У компилятора нет проблем с этим, потому что NSMutableArray также является NSArray, но он падает при попытке добавить объект.

0 голосов
/ 17 ноября 2011

Это исключение может произойти, если один из объектов в массиве равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...