Управление памятью с помощью pushViewController

Я все еще не так хорош в методах управления памятью, и подумал, может ли кто-нибудь объяснить это странное поведение для меня. Рассмотрим эти 3 части кода, которые я тестировал:

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
NSLog(@"dof retain count = %d", [dofView retainCount]); 

Эти журналы: сохранить count = 1. Это нормально.

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[dofView release];
NSLog(@"dof retain count = %d", [dofView retainCount]); 

Эти журналы: сохранить count = 1. Не должно быть 0??

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
NSLog(@"dof retian count = %d", [dofView retainCount]);

Этот журнал: сохранить count = 5. У меня нет идеи, почему его пять?

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

Спасибо!

Ответы

Ответ 1

Не полагайтесь на retainCount для анализа памяти. Прочтите справочные документы Управление памятью для получения дополнительной информации

Ответ 2

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

Ответ 4

Важно знать, что релиз происходит немедленно (автореферат занимает некоторое время).

Итак, почему у вашего объекта все еще есть счетчик в 1?

Потому что он был освобожден - это не ваш объект больше, это просто свободная память!

Попробуйте сделать это:

NSObject* o = [[NSObject alloc] init];
NSLog(@"retain count = %d", [o retainCount]); 
[o retain];
NSLog(@"retain count = %d", [o retainCount]); 
[o release];
NSLog(@"retain count = %d", [o retainCount]); 
[o release];
NSLog(@"retain count = %d", [o retainCount]); 

Вы получаете вывод

retain count = 1
retain count = 2
retain count = 1
retain count = 1

Вы могли бы ожидать, что последняя строка будет указывать 0, а не 1. Однако она не будет беспокоить декремент счета удержания, если он будет выпущен - какая будет точка!

На самом деле тот факт, что последняя строка выводит что-либо вообще без сбоев, - это удача - потому что объект был освобожден, и ничего не останавливает, что память используется чем-то другим - это фактически просто случайные данные. Это как раз ошибка, вызывающая сбои EXC_BAD_ACCESS:)

На самом деле вы получаете предупреждение анализатора компилятора в последнем NSLog, потому что вы передаете сообщение объекту, который больше не существует:)


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

Пока вы освобождаетесь за каждое сохранение, которое вы делаете, вы поступаете правильно.

Если вас беспокоит утечка, используйте профайлер и проверьте!

Ответ 5

Свойство saveCount зависит от того, как работает UINavigationController с контроллером, который вы нажимаете. Если он сохраняется в объекте UIViewController, вам не следует беспокоиться. Важно то, что когда вы используете этот объект, вы отпускаете его, когда вам это больше не нужно.

например. в этом случае, поскольку вы нажимаете новый контроллер на навигатор, вы должны сделать это:

DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
[dofView release];

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

Если вы считаете, что у вас утечка памяти, вы должны использовать инструменты профилирования внутри Xcode (поиск утечек памяти).

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

Ответ 6

не полагайтесь на количество удержаний. в прошлом я также пытаюсь проверить счетчик хранения для управления памятью, но он всегда меня путает (проверьте эту ссылку, когда удержание счета сбивает меня с толку [http://stackoverflow.com/q/5483357/644149]. Просто следуйте простой строке руководства, тогда вы будете не имеют утечек памяти в приложениях ur

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

Ответ 7

Вызов release не вступает в силу немедленно, поэтому счет сохранения может выглядеть неправильно. Вы можете использовать инструмент "Утечки", чтобы отслеживать проблемы с памятью, но, пока вы следуете правилам mgmt в памяти, вы должны быть в порядке, обычно.