2009-03-17 4 views
0

У меня есть UIScrollView, который имеет несколько страниц информации, которые добавляются в качестве подзонов в scrollView. Каждый контроллер subView хранится в NSMutableArray в scrollViewController.Освобождение подзаголовков

У меня есть некоторые утечки памяти в подзаголовках, и я пытаюсь их исправить, убедившись, что вызывается метод dealloc каждого контроллера subview. Я делаю это, выпуская контроллеры представлений из метода dealloc контроллера scrollView.

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

Код следует за тем, что я делаю неправильно?

- (void)dealloc { 

// Loop through the array of subView controllers and release them 
for (int i = 0; i < [viewControllers count]; i ++) { 
    [[viewControllers objectAtIndex:i] release]; 
} 

[viewControllers release]; // Crashes here unless I remove the loop above 
[scrollView release]; 
[pageControl release]; 
[theKnot release]; 
[super dealloc]; 

}

ответ

4

NSMutableArray становится владельцем объектов, которые он содержит - это увеличивает их количество ссылок при добавлении, и выпустит свои объекты, когда он освобождает себя.

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

Сбой при выпуске массива, потому что массив пытается освободить уже выпущенные объекты и теперь недействителен.

1

NSArray выпускает свое содержимое, когда оно отменено, поэтому объекты освобождаются как в вашем цикле, что, по-видимому, освобождает их, а затем массивом.

Вы должны прочитать memory management guide от Apple, если вы планируете создавать приложения для iPhone. Это не так сложно, но вам нужно учиться чему-то. В противном случае вы получите утечки и сбои и не знаете, почему. Как только вы поймете несколько простых правил Какао, все будет ясно.

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