Сбой приложения из-за исключения другого типа

#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. .