#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 из метода, который зависит от удаляемой информации. Я настроил пару кнопок, для которых требуется отображение информации в массиве, и я, очевидно, не могу удалить информацию, необходимую для кнопок, ПРЕЖДЕ чем удалять кнопки, которые зависят от этой информации. Большое спасибо за вашу помощь и вопросы!