NSMutableArray removeObjectAtIndex - PullRequest
       18

NSMutableArray removeObjectAtIndex

6 голосов
/ 13 июля 2011

Я получаю следующую ошибку при удалении из моего NSMutableArray

-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10
2011-07-13 00:33:14.333 MassText[1726:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10'

Однако прямо перед удалением я распечатываю массив и индекс. Ни один не ноль, и у меня нет причин полагать, почему эта ошибка произошла. Есть идеи?

Ответы [ 6 ]

8 голосов
/ 07 февраля 2013

У меня была эта проблема.Мое было то, что я случайно использовал приведение типа вот так.

NSMutablearray * myarray = [[NSMutableArray alloc] init];
myarray =(NSMutableArray*) [mydictionary allkeys];

Это будет работать некоторое время ... но если вы находитесь в крутом и большом цикле, это может привести к сбою.

Я изменил свой код на

NSMutableArray * myarray= [[NSMutablearray alloc] initWithArray:[mydictionary allKeys]];
7 голосов
/ 13 июля 2011

Объект является NSArray, а не NSMutableArray.

4 голосов
/ 13 июля 2011

На этом этапе четыре умных человека (не считая меня) указали, что вы отправляете -removeObjectAtIndex: объекту, который считает, что это неизменный массив.Сейчас самое время задуматься о , почему массив неизменен, если вы ранее думали, что он изменчив.Если вы опубликуете некоторый код, который показывает, как создается массив, кто-то здесь, вероятно, сможет показать вам, что происходит не так.

Один из способов, которым вы можете получить неизменяемый массив, когда вы думали, что у вас изменяемыйОдним из них является копирование изменяемого массива.Например, у вас может быть свойство:

@property (copy) NSMutableArray *myArray;

Возможно, вы затем создаете изменяемый массив, добавляете несколько объектов и присваиваете его свойству:

NSMutableArray *tempArray = [NSMutableArray array];
[tempArray addObject:@"You say goodbye"];
[tempArray addObject:@"I say hello"];
self.myArray = tempArray;

Теперь, делает ли tempArrayуказывают на изменяемый массив или неизменный массив?Я недавно не проверял, но я уверен, что вы получите неизменный массив.Вы обязательно получите immutableArray, если скажете:

NSMutableArray *foo = [tempArray copy];

Итак, начните искать места в вашем коде, где указатель массива переназначается.В конце концов, если бы ваш указатель действительно указывал на изменяемый массив, было бы ужасно трудно объяснить исключение, которое вы получаете.

4 голосов
/ 13 июля 2011

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

Убедитесь, что массив действительно NSMutableArray , а не NSArray .

4 голосов
/ 13 июля 2011

Вы вызываете removeObjectAtIndex для экземпляра NSArray.Мы ясно видим по вашему журналу аварий.

0 голосов
/ 25 октября 2013

У меня была такая же проблема, и это было из-за использования метода копирования. Я сделал один самостоятельно, возвращая NSMutableArray *, и он работал.

...