Освобождение объектов: [obj release]; недостаточно, нужно [obj release], obj = nil ;? - PullRequest
0 голосов
/ 09 сентября 2011

Здесь я получил некрасивый код:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy"];
NSDate *date = [NSDate date];
NSString *textWithYear = [NSString stringWithFormat:@"text and year %@", [dateFormatter stringFromDate:date] ];
[dateFormatter release];
NSLog(@"%i", [dateFormatter retainCount]); // returns 1 !

Как видите, сохраняет счетчик возвращает 1, что, я полагаю, означает, что объект не освобожден.Если я изменю эту строку на

[dateFormatter release], dateFromatter = nil;

сохраняет счетчик возвращает 0, что предположительно потому, что он не может считать, сохраняет для nil:)

Есть что-то, что я не понимаюсохраняет счетчик, или этот объект действительно не выпущен?Когда я отправляю release на него во второй раз (стремясь получить ноль, сохраняется количество), он ожидаемо ломается:)

И еще один вопрос: если dateFormatter действительно был выпущен, почему он не падает,я называю [dateFormatter retainCount]?

1 Ответ

7 голосов
/ 09 сентября 2011

Вы правильно отпускаете свой объект;не беспокойся о сохранении счета.И не используйте -retainCount.См. Когда использовать -retainCount? или Вызов -retainCount Считается вредным для получения более подробной информации о причинах.

Обратите внимание, что ваш код будет падать, если объект действительноуничтожен (потому что вызов -retainCount приходит после того, как вы его отпустили, и может быть на висящий указатель);установка ваших переменных на nil после того, как вы поработаете с ними, является хорошей привычкой для защиты от этого.Но это не имеет ничего общего с утечкой кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...