UIViewController сохраняет проблему: счетчик никогда не достигает нуля - PullRequest
1 голос
/ 11 октября 2010

Пожалуйста, посмотрите на мой код ниже.Эта часть извлекает контроллер стека (обычно тот же ArticleControllerController) из стека (я обнаружил, что проблема остается прежней, независимо от того, вставляю я один контроллер или попадаю в корневой контроллер), создает новый и добавляет в стек.

Проблема в том, что его счетчик хранения никогда не обнуляется, и поэтому dealloc метод ArticleControllerController никогда не вызывается, оставляя большое количество различных объектов интерфейса невыпущенными.В конечном итоге приложение вылетает (по крайней мере, на устройстве, и, по крайней мере, я думаю, что эта часть является основной проблемой) из-за нехватки памяти.

- (void) navigateToNewsCategoryByIndex:(int)idx {
    [app.nav popViewControllerAnimated:NO]; // could be popToRootController
    ArticleControllerController *ac = [[ArticleControllerController alloc] init];
    ac.categoryIndex = idx;
    [app.nav pushViewController:ac animated:NO];
    [ac release];
    NSLog(@"AC retain count: %d", [ac retainCount]); // prints 2
} 

Так что, я думаю, popViewControllerAnimated выпускает только одно из двух оставшихся сохранений.Зачем?Что я должен искать?Что я могу сделать?Позвоните [ac release] два раза (это было бы ужасно)?

1 Ответ

1 голос
/ 11 октября 2010

Откуда вы знаете, что сохранение счетчика 2 не является правильным поведением для контроллера навигации?

Вы не можете полагаться на retainCount при выполнении отладки alloc / release, потому что мы не знаем, каквнутренности работы UIKit.Пока вы сохраняете и выпускаете правильно в своем коде, вы можете быть на 99,9% уверены, что UIKit также будет работать правильно.

Я бы предположил, что popViewController удалит все удержания, которые добавил pushViewController - даже если я неНе знаю, сколько их будет, но он может установить автоматическое освобождение, поэтому вы не можете гарантировать, что оно будет выпущено сразу после вызова popViewController.

Я бы работал, исходя из предположения, что UIKitу контроллера навигации нет ошибки (в противном случае многие другие разработчики будут жаловаться на это!), и где-то в вашем коде вы сохраняете его где-то еще (вероятно, не осознавая этого, то есть свойство делегата, объявленное как сохраняющее вместо assign и т. д.)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...