Важно знать, освобождение происходит немедленно (автоматическое освобождение занимает некоторое время).
Так почему же ваш объект все еще имеет счет удержания 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 - я могу только повторить другие ответы - вы не знаете, что происходит внутри объектов - просто потому, что вы вызывали удерживать только один раз, не означаетчто никто другой не называл retain:)
Пока вы отпускаете за каждое сделанное вами удержание, вы делаете правильные вещи.
Если вы беспокоитесь о утечках, используйтепрофиль и проверь!