Ответ 1
Не полагайтесь на retainCount
для анализа памяти. Прочтите справочные документы Управление памятью для получения дополнительной информации
Я все еще не так хорош в методах управления памятью, и подумал, может ли кто-нибудь объяснить это странное поведение для меня. Рассмотрим эти 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. У меня нет идеи, почему его пять?
Каким же кто-нибудь пролил свет на это вообще? Я обеспокоен тем, что я ем память каждый раз, когда создаю новое представление.Спасибо!
Не полагайтесь на retainCount
для анализа памяти. Прочтите справочные документы Управление памятью для получения дополнительной информации
Глядя на счет сохранения, он сильно обескуражен, он не даст вам никакой ценной информации. Если вы хотите знать, что что-то получает должным образом, вы должны поместить контрольную точку или регистрационную запись в методе dealloc вашего класса - при вызове dealloc объект очень скоро будет выпущен. Помимо инструментальных приложений, это то, что я использую, чтобы найти циклы сохранения.
Когда использовать -retainCount?
holdcount кажется бесполезным
Важно знать, что релиз происходит немедленно (автореферат занимает некоторое время).
Итак, почему у вашего объекта все еще есть счетчик в 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 - я могу только откликнуться на другие ответы - вы не знаете, что происходит внутри объектов - только потому, что вы только назвали сохранение один раз, это не значит, что никто другой не назвал сохранение:)
Пока вы освобождаетесь за каждое сохранение, которое вы делаете, вы поступаете правильно.
Если вас беспокоит утечка, используйте профайлер и проверьте!
Свойство saveCount зависит от того, как работает UINavigationController с контроллером, который вы нажимаете. Если он сохраняется в объекте UIViewController, вам не следует беспокоиться. Важно то, что когда вы используете этот объект, вы отпускаете его, когда вам это больше не нужно.
например. в этом случае, поскольку вы нажимаете новый контроллер на навигатор, вы должны сделать это:
DofView* dofView = [[DofView alloc] initWithNibName:@"DofView" bundle:nil];
[self.navigationController pushViewController:dofView animated:YES];
[dofView release];
Счетчик сохранения для объекта, вероятно, не обновляется мгновенно, поэтому вам не стоит беспокоиться об этом.
Если вы считаете, что у вас утечка памяти, вы должны использовать инструменты профилирования внутри Xcode (поиск утечек памяти).
Надеюсь, что это поможет.
не полагайтесь на количество удержаний. в прошлом я также пытаюсь проверить счетчик хранения для управления памятью, но он всегда меня путает (проверьте эту ссылку, когда удержание счета сбивает меня с толку [http://stackoverflow.com/q/5483357/644149]. Просто следуйте простой строке руководства, тогда вы будете не имеют утечек памяти в приложениях ur
когда вы используете alloc, new, copy, сохраняете, вам также следует освободить этот объект. простой
Вызов release
не вступает в силу немедленно, поэтому счет сохранения может выглядеть неправильно. Вы можете использовать инструмент "Утечки", чтобы отслеживать проблемы с памятью, но, пока вы следуете правилам mgmt в памяти, вы должны быть в порядке, обычно.