2013-05-10 3 views
14

В моем проекте iphone (ARC enabled) у меня есть массив nsmuatble, который содержит около 5 управляемых объектов (которые извлекаются из основных данных), и в некоторых случаях мне нужно удалить все объекты из этого nsmutablearrayсбой при удалении объектов из NSMutableArray

я использовал следующие методы для удаления объектов, но его сбоями в обоих случаях с бревном аварии -[__NSArrayI removeObject:]: unrecognized selector sent to instance 0xa391640

if (surveys && [surveys count]>0) 
     { 

      [surveys removeAllObjects]; 
      surveys = [[NSMutableArray alloc]init]; 
     } 

, а также я попытался

if (surveys && [surveys count]>0) 
     { 
      for(Survey *obj_Survey in surveys) 
      { 
       [surveys removeObject:obj_Survey]; 
      } 

      surveys = [[NSMutableArray alloc]init]; 
     } 

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

+1

Где объявляются и инициализируются опросы? Из журнала сбоев похоже, что это NSArray, а не NSMutableArray. – skladek

+2

Почему вы удаляете все объекты из массива, если вы собираетесь заменить его другим массивом? Просто отпустите массив и создайте новый. – vcsjones

+0

@vcsjones Я в среде с поддержкой ARC, как мне освободить объект? –

ответ

16

Ответ очень прост.

Для первого случая.
Проверьте, где вы инициализировали массив, и проверьте, где-то через ваш код, если вы назначили NSArray для вашего объекта NSMutableArray.

Для второго случая.
Вы не можете удалить объекты из массива во время перечисления через него.Это приведет к сбою: array has mutated while enumerating

+0

ya в одном месте Я назначаю NSArray * sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor1, nil]; survey = (NSMutableArray *) [[[NSMutableArray alloc] initWithArray: survey] sortedArrayUsingDescriptors: sortDescriptors]; Я предполагаю, что это вызывает эту проблему, как я могу это решить? –

+0

@RaviKiran Если вы проводите опросы, это mutableArray '[survey sortUsingDescriptors: sortDescriptors];' будет отлично. – Anupdas

+0

@ Анупдас спасибо, он отлично работал –

7

сообщение об ошибке говорит, что все это,

[__NSArrayI removeObject:]: unrecognized selector 

__NSArrayI является кодовым словом a неизменяемый массив (NSArray). Это означает, что объект ваших обследований не NSMutablArray, но NSArray.

Вы не можете добавить или удалить объекты из NSArray.

Проверьте свой код. Вы назначили NSArray опросам или вы его повторно инициализировали как NSArray.

+0

Я пробовал это ,,, его сбой, выбрасывая исключение [__NSArrayI removeObject:]: нераспознанный селектор, отправленный экземпляру 0xa391640 –

+0

Если вы хотите добавить объекты в свой NSMutableArray, который найден в NSArray, просто выполните цикл for внутри NSArray и добавьте его один за другим в свой NSMutableArray. Таким образом, вы можете удалитьAllObjects внутри вашего NSMutableArray. Не назначайте NSArray прямому NSMutableArray, поскольку это делает массив, который больше не изменен. – jaytrixz

1

Удалить все то, что вы делаете, и просто сделать, как этот

[surveys removeAllObjects]; 

Как от ошибки, что вы получаете так может быть, что массив не NSMutableArray просто нормальный массив так вот почему вы не можете удалить объект от него и вы пытаетесь сделать это, и приложение получило аварии

чека, где вы инициализируется, если это Mutable или не

так, как я сказал, удалить все, что вещь и использовать простые removeAllObject

8

Это:

[__NSArrayI removeObject:] : unrecognized selector sent to instance 0xa391640 

указывает, что ваш массив "исследования" является NSArray (не-изменчивый). Вы уверены, что правильно инициализировали его? Если вы делаете это уступка, как этих

NSMutableArray* surveys = [someManagedObjectContext executeFetchRequest:request] 

массив «исследования» будет иметь тип NSArray, поскольку основные выборку данных запросов возврата NSArrays.

0

С исключительной очевидностью видно, что в какой-то момент вы назначаете неизменяемый экземпляр вашего изменяемого массива. Из комментариев я мог понять, что вы сортировали surveys, и отсортированный массив возвращал неизменяемый массив. Тип casting не будет полезен для получения mutableCopy неизменяемого объекта.

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil]; 
surveys = (NSMutableArray *) [[[NSMutableArray alloc]initWithArray:surveys ] sortedArrayUsingDescriptors:sortDescriptors]; 

Вместо этого используйте

[surveys sortUsingDescriptors: @[sortDescriptor1]]; 
0

Вы могли бы инициализирован с неизменяемыми Array. Используйте следующий код:

NSMutableArray * newArray = [NSMutableArray arrayWithArray: oldArray];

Смежные вопросы