Как исправить странный счет удержания (1 init - 3 retaincount)? + редактировать: проблема dealloc - PullRequest
1 голос
/ 11 октября 2010

Итак, мой код выглядит следующим образом:

ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
NSLog(@"acc retain: %d", [ac retainCount]);        
[app.nav pushViewController:ac animated:NO];
NSLog(@"acc retain: %d", [ac retainCount]);        
[ac release];
NSLog(@"acc retain: %d", [ac retainCount]);    

И я получаю:

[2649:207] acc retain: 1
[2649:207] acc retain: 3
[2649:207] acc retain: 2    

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

Редактирование: связанная проблема.

Таким образом, ситуация такая же, как определено выше, нопроблема в том, что метод dealloc ArticleControllerController никогда не вызывается.

Дополнительный код:

- (void) navigateToNewsCategoryByIndex:(int)idx {
[app.nav popViewControllerAnimated:NO]; 

currentMode = MODE_ARTICLE;
ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
[app.nav pushViewController:ac animated:NO];
[ac release];
return ;        

}

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

Что случилось стот?Могу ли я сделать что-то еще, чтобы решить эту проблему?

1 Ответ

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

Это выглядит хорошо для меня.После того, как вы создали его, «ac» имеет счет сохранения 1, который является правильным.Затем вы отправляете его в app.nav, и там учитываются еще два сохранения, что нормально.Этот класс обязан выпустить все, что у него есть.Наконец, вы освобождаете созданный вами экземпляр, и количество сохраняемых записей уменьшается до 2. Но эти два значения не входят в вашу ответственность, то есть app.nav.

Именно поэтому вам не стоит беспокоиться о распечатке retainCountтак как это может выглядеть странно, когда вы не знаете, что происходит за кулисами в другом классе.

Все, что вам нужно сделать, - это один релиз на каждый alloc, и вы сделали это

...