Счетчик ссылок по-прежнему равен 1 после [obj release], когда он должен быть освобожден - PullRequest
2 голосов
/ 05 марта 2011

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

NSMutableString *str=[[NSMutableString alloc] initWithString:@"hello"];
NSLog(@"reference count is %i",[str retainCount]);
[str release];
NSLog(@"reference count is %i",[str retainCount]);

I do См. 0 для счетчика сохранения, если я сначала установлю str на nil. Почему это так?

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Не используйте retainCount, в большинстве случаев он не работает так, как вы ожидаете.

Ваш второй NSLog обращается к освобожденной памяти как объекту.В этом конкретном случае эта освобожденная память все еще содержит достаточно старых данных из строки NSString, которая была только что освобождена для программы, чтобы не вылетать при вызове метода retainCount.Если бы вы запустили это с NSZombieEnabled, вы бы получили сообщение об ошибке при отправке сообщения в освобожденный экземпляр.

Причина, по которой он возвращает 0 при вызове nil, состоит в том, что методы, возвращающие целые числа, всегда возвращают 0 при вызовена нулевом объекте.

2 голосов
/ 05 марта 2011

Не зависит от retainCount.И пофиг на это.Много вещей может произойти под капотом.Вам нужно только убедиться, что вы выпустили все вещи, которые у вас были.Если вы пытаетесь убедиться, что у вас нет утечки памяти, используйте инструмент, а не retainCount в NSLog.

...