0

я написал следующий фрагмент кода:UIViewController pushViewController высокий сохранить счетчик Зрения контроллера

-(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]; 
} 

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

Я хотел бы контроллер зрения dealloc'd, когда я совать его стек ..

+0

попытайтесь изменить его на автообновление и посмотреть, что произойдет – Janub

+0

он меняется на 7! – Lolloz89

+1

Не используйте 'keepCount' для проверки утечек. Используйте инструмент инструментов. Найдите SO для «keepcount», вы найдете много и много причин, почему это ужасное свойство в 99% случаев. Это просто не стоит хлопот в течение 1% времени, когда это полезно. – lxt

ответ

1

Autorelease ваше творение GameController, как это:

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

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

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

1

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

6

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

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

NSObject Protocol Reference. RetainCount discussion

+3

Желаю, чтобы больше людей проголосовали за это. 'keepCount' - бесполезное свойство и никогда не должно было быть в общедоступном SDK. – lxt

0

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