У меня есть следующая часть кода:
NSString *tempString = [[выделение NSString] initWithFormat:@" %d / % d / % d", день, месяц, год];
dateString = tempString;
[выпуск tempString];
NSLog ("сохраняют счет datstring и tempstring, является %d и %d", [dateString retainCount], [tempString retainCount]);
NSLog ("% и %", dateString, tempString)
Теперь это печатает сохранить количество tempString как 1 (также dateString, сохраняют количество = 1) даже при том, что я выпускаю его в строке прежде. Также оператор NSlog, печатающий две строки ничего не отображает. Я предполагаю, что это вызвано тем, что, с тех пор моим кодом, dateString указывает на местоположение tempString, и tempString был выпущен, NSlog будет не мочь распечатать строку. Но затем почему сохранить количество tempString = 1?
Если я заменяю строку
dateString = tempString;
с
dateString = [NSString stringWithString: tempString];
затем оператор NSlog печатает значения и dateString и tempString и отображает их сохранять количества как 1. Как значение tempString распечатало, когда я выпускаю его в предыдущей строке?
Когда вы отправляете релиз в tempString, среда выполнения objc просто вызывает dealloc. Тот факт, что объект был отправлен Dealloc, не означает, что его данные в куче немедленно уничтожаются. Он просто помечен для уничтожения позже.
Прочитайте документацию по iphone:
Вы не должны использовать
retainCount
для отладки проблем управления памятью.
Как утверждает jamapag, release
просто говорит среде выполнения выполнить dealloc
, что означает, что память помечена как многократно используемая, а не то, что она была очищена. Для объектов с retainCount
, равным 1, среда выполнения обычно не уменьшает значение retainCount
после dealloc
.
Еще одно замечание: не следует посылать сообщения освобожденным объектам, как вы это делаете с retainCount
, вы можете получить неожиданное поведение