#iphone #nsmutablearray
#iPhone #nsmutablearray
Вопрос:
Здравствуйте, я беру записи из объекта core data и отображаю их в tableview. Мое приложение выходит из строя, когда я просматриваю записи и возвращаюсь обратно, но не все время. Вот мой код
//загрузить существующий текст
- (void)loadLyricsForSong {
NSMutableArray *arrayOfLyrics = [[NSMutableArray alloc] initWithArray:[song.songLyrics allObjects]];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc]initWithKey:@"startTime" ascending:YES];//name wise sorting in asecending order
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:nameDescriptor,nil];
[arrayOfLyrics sortUsingDescriptors:sortDescriptors];
[self setLyricsArray:arrayOfLyrics];//setting mutable array with places
[nameDescriptor release];
[sortDescriptors release]; //releasing objects
[arrayOfLyrics release];
[self.tableView reloadData];
}
Я вызываю этот метод loadLyricsForSong в viewWillAppear. и выпустил lyricsArray методом Dealloc..
И исключениями являются
> *** -[UITouchData retain]: message sent to deallocated instance 0x5da0860
> *** -[NSConcreteNotification retain]: message sent to deallocated instance 0x5d919b0
> *** -[CFArray retain]: message sent to deallocated instance 0x5b47d30
Пожалуйста, помогите..
Заранее благодарим
Ответ №1:
Как выглядит ваше @property
объявление для lyricsArray
? Если для него установлено значение assign
, а не retain
, то этот код вызовет сбой. Убедитесь, что для него установлено значение retain
.
Комментарии:
1. Также найдите в Google информацию о включении
NSZombies
, поскольку это позволяет сохранить хотя бы некоторую информацию об освобожденных объектах. Однако это заставляет ваше приложение потреблять больше памяти и должно быть отключено для вашего производственного выпуска.2. @property (неатомный, сохранить)NSMutableArray * lyricsArray;
3. NSMutableArray *arrayOfLyrics = [[[NSMutableArray alloc] initWithArray:[song.songLyrics allObjects]] сохранить]; Я использую подобное, и приложение не выходит из строя, но происходит утечка в этой строке 100%
4. просто предложение по кодированию, почему вы выделяете и инициализируете все эти объекты, если вы прекращаете использовать его в конце метода, когда вы могли бы просто использовать методы класса для создания автоматически выпущенной версии.
5.Похоже, что вы
lyricsArray
где-то переиздаете. Проверьте в другом месте вашего кода. В вашемdealloc
методе вам нужно только вызватьself.lyricsArray = nil;
… также не вызывайте,[lyricsArray release]
поскольку присвоение nil приводит к такому эффекту при использованииself.
.