запрос относительно объекта NSString и управления памятью - PullRequest
1 голос
/ 04 августа 2010

У меня есть следующий фрагмент кода:

NSString * tempString = [[NSString alloc] initWithFormat: @ "% d /% d /% d", день, месяц, год];

dateString = tempString;

[выпуск tempString];

NSLog (@ "сохранить счет для строки данных и строки Tempstring% d и% d", [dateString retainCount], [tempString retainCount]);

NSLog (@ "% @ and% @", dateString, tempString)

Теперь он печатает счет сохранения tempString как 1 (также dateString retain count = 1), даже если я освобождаю его в строке ранее. Также оператор NSlog, печатающий две строки, ничего не отображает. Я предполагаю, что это потому, что, поскольку в моем коде dateString указывает на местоположение tempString, и tempString был освобожден, NSlog не сможет распечатать строку. Но тогда почему счетчик хранения tempString = 1?

Если я заменю строку

dateString = tempString;

с

dateString = [NSString stringWithString: tempString];

тогда оператор NSlog печатает значения dateString и tempString и отображает их счетчики сохранения как 1. Как значение tempString печатается, когда я освобождаю его в предыдущей строке?

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Прочитайте документацию по iphone:

Вы не должны использовать retainCount для отладка проблем управления памятью.

Как утверждает jamapag, release просто указывает среде выполнения запустить dealloc, что означает, что память помечена как многоразовая, а не очищена. Для объектов с retainCount, равным 1, среда выполнения обычно не уменьшает значение retainCount после dealloc.

Еще одна вещь, на которую следует обратить внимание, это то, что вы не должны отправлять сообщения освобожденным объектам, как вы делаете с retainCount, вы неизбежно получите некоторые неожиданные поведения

0 голосов
/ 04 августа 2010

Когда вы отправляете release в tempString, среда выполнения objc просто вызывает dealloc. Тот факт, что объект был отправлен dealloc, не означает, что его данные в куче немедленно уничтожаются. Это просто помечено для уничтожения позже.

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