UIViewController pushViewController высокий счет сохранения контроллера View - PullRequest
0 голосов
/ 04 марта 2012

Я написал следующий фрагмент кода:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

GameViewController *gameViewController = [[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO];

NSLog(@"Retain Counter =%d",gameViewController.retainCount);

[navController pushViewController:gameViewController animated:YES];
[gameViewController release];

NSLog(@"Retain Counter=%d",gameViewController.retainCount);

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Результаты двух журналов, в последовательности 1 и 6 !Как это возможно?Я только вызываю метод alloc только один раз и освобождаю после добавления контроллера в стек. Alloc-> +1, push-> +1, release-> -1 = 1 или нет?

Я быкак будто контроллер представления освобождается, когда я вытаскиваю его из стека ..

Ответы [ 4 ]

6 голосов
/ 04 марта 2012

Пожалуйста, прочтите это примечание, чтобы уточнить этот вопрос. Он является частью NSObject Reference Reference :

Важно: Этот метод обычно не имеет значения при отладке проблем управления памятью. Поскольку любое количество объектов каркаса может сохранять объект для хранения ссылок на него, в то время как пулы авто-выпуска могут содержать любое количество отложенных выпусков объекта, Маловероятно, что вы можете получить полезную информацию с помощью этого метода .

Ссылка на протокол NSObject. СохранитьСчет обсуждения

1 голос
/ 04 марта 2012

Это связано с тем, что существует некоторое внутреннее сохранение (с помощью pushViewController: метод), вы не должны проверять счетчик сохранения, только проверять, что вы освобождаете свой собственный объект, особенно когда вы проверяете счетчик хранения между методами вызова sdk.

1 голос
/ 04 марта 2012

Автоматический выпуск созданного вами GameController, например:

GameViewController *gameViewController = [[[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO] autorelease];

Затем удалите [gameViewController release]; Тогда ваш код выглядит кошерным, и gameViewController будет автоматически освобожден после извлечения из стека навигации. Не беспокойтесь о retainCount - когда вы нажимаете контроллер вида, UIKit вступает во владение и будет retain / release вещь по мере необходимости Вам просто нужно беспокоиться о своем коде. На самом деле, то, как вы это написали, должно быть хорошо, я просто думаю, что мои предложения здесь делают код чище.

Если вы не увидите в приборах, что у вас есть утечка памяти вашего gameViewController объекта, я думаю, вам не о чем беспокоиться.

0 голосов
/ 04 марта 2012

Используете ли вы NSNotificationCenter в вашем GameViewController?Может быть, вы добавите свой контроллер представления в качестве наблюдателя в NotificationCenter, и это увеличит retainCount.

...