Как удалить в NSMutableArray

#iphone #objective-c #cocoa-touch #nsmutablearray

#iPhone #objective-c #cocoa-touch #nsmutablearray

Вопрос:

У меня есть массив, в котором я храню разные классы, которые снова содержат разные массивы. Все массивы определяются как NSMutabelArrays.

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

 NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabReference] objectAtIndex:tid]);
NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabColours] objectAtIndex:tid]);
NSLog(@"string to be deleted:%@", [[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabTitles] objectAtIndex:tid]);

[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabReference] removeObjectAtIndex:tid];
[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabColours] removeObjectAtIndex:tid];
[[[self.myLibrary objectAtIndex:self.currentNoteBookNumber] tabTitles] removeObjectAtIndex:tid];
  

И это вывод на консоль:

 2011-05-01 22:03:40.788 M[61452:207] string to be deleted:2
2011-05-01 22:03:40.789 M[61452:207] string to be deleted:Orange
2011-05-01 22:03:40.791 M[61452:207] string to be deleted:Art
2011-05-01 22:03:40.806 M[61452:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 0 beyond bounds for empty array'
  

Я действительно не знаю, что я делаю не так. Очевидно, что в массиве что-то есть, поэтому оно не должно быть 0. Я имею в виду, что это ЕДИНСТВЕННОЕ, что хранится в массиве на данный момент, но это не должно быть проблемой, я полагаю?

Я был бы очень благодарен за любую помощь в этом.


Редактировать:

Я думаю, что я не предоставил достаточно кода. Это метод, с помощью которого я настраиваю MyLibrary:

 -(void) setupLibrary {

myLibrary = [[NSMutableArray alloc] init];

NoteBook *newNoteBook = [[NoteBook alloc] init];

newNoteBook.titleName = @"TEST";

NSMutableArray *ttArray = [[NSMutableArray alloc] init];
[ttArray addObject:@"Art"];

NSMutableArray *tcArray = [[NSMutableArray alloc] init];
[tcArray addObject:@"Orange"];

NSMutableArray *trArray = [[NSMutableArray alloc] init];
[trArray addObject: [NSNumber numberWithInteger:2]];

newNoteBook.tabTitles = ttArray;
newNoteBook.tabColours = tcArray;
newNoteBook.tabReference = trArray;

[myLibrary addObject:newNoteBook];
currentNoteBookNumber = 0;

[newNoteBook release];
[ttArray release];
[tcArray release];
[trArray release];
  

}

Теперь оказывается, что если я удаляю, например, один объект в массиве tabTitles (например, «Art»), я удаляю весь объект newNoteBook. Т.е. как только я удаляю строку в tabTitles, все остальные строки в той же позиции в tabColours или tabReference также будут удалены. Почему это так?

Следующий код завершит работу после того, как я успешно удалил строку @ position 0 в массиве моего класса, который хранится в другом массиве:

     NSLog(@"string deleted:%@", [[[self.myLibrary objectAtIndex:0] tabReference] objectAtIndex:0]);
[[[self.myLibrary objectAtIndex:0] tabReference] removeObjectAtIndex:0];

NSLog(@"string deleted:%@", [[[self.myLibrary objectAtIndex:0] tabColours] objectAtIndex:0]);
[[[self.myLibrary objectAtIndex:0] tabColours] removeObjectAtIndex:0];
  

Комментарии:

1. Хммм, вы можете дублировать свои три nslogs и помещать их между каждым удалением? И также сбросьте количество элементов массива в нем.

2. Можете ли вы дать больше кода? Например, где вы создаете и вставляете объекты? И поместите весь метод, в котором у вас есть приведенный выше код. Это может помочь.

3. @Ник Уивер: Я обновил код в соответствии с вашими предложениями. Кроме того, я дал больше кода о том, как я настраиваю библиотеку. Мы очень ценим вашу помощь и терпение!

4. @Cyprian: Я отредактировал свой пост и добавил больше кода. Спасибо за вашу помощь, и я думаю, что вы правы в предложенном ниже ответе, но я все еще не совсем понимаю, в чем проблема…

5. @n.evermind все еще нужна дополнительная информация. Где вы вызываете свой код удаления. Пожалуйста, добавьте этот метод, а также происходит ли сбой вашего кода после NSLog или после удаления? И в чем именно заключается сбой.

Ответ №1:

Не знаю, в чем здесь проблема, но вам следует подумать о том, чтобы сохранить ваши массивы в безопасности:

 if([yourArray count] > tid) {
    [yourArray removeObjectAtIndex.tid;
}
  

Комментарии:

1. Спасибо. Я обновил свой вопрос дополнительным кодом — не знаю, можно ли вас побеспокоить, чтобы посмотреть еще раз. Если это так, я был бы очень благодарен. Спасибо!

Ответ №2:

Ваша ошибка

 -[NSMutableArray objectAtIndex:]: index 0 
  

указывает на то, что вы пытаетесь получить объект с индексом 0, а не на то, что вы хотите его удалить. Итак, я думаю, что вы вызвали метод, в котором вы читаете и удаляете код 2 раза подряд. Попытайтесь увидеть, что это так.

Комментарии:

1. На самом деле, ваши предложения опубликовать больше информации на самом деле были решением!! Я понял, что вызываю метод removeObject из метода, который зависит от удаляемой информации. Я настроил пару кнопок, для которых требуется отображение информации в массиве, и я, очевидно, не могу удалить информацию, необходимую для кнопок, ПРЕЖДЕ чем удалять кнопки, которые зависят от этой информации. Большое спасибо за вашу помощь и вопросы!