Как я могу проверить, освобожден ли объект?

Мне нужно иметь возможность проверить, выпустил ли я уже переменную в target-c. Я попытался проверить, изменилось ли оно на ноль:

//Checks if buildview is null and returns respective output
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

//allocates memory and initalizes value
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

//Releases the view
[BuildView release];

//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

Результаты были следующими:

Build View Value (pointer): Null
Build View Value (pointer): Not Null
Build View Value (pointer): Not Null

Есть ли более простой способ проверить, освобожден ли он?


person rdelfin    schedule 17.10.2011    source источник
comment
Кажется, вы спрашиваете не о том, был ли объект освобожден, а о том, был ли он освобожден.   -  person PengOne    schedule 17.10.2011
comment
возможный дубликат Как определить, есть ли у меня указатель на выпущенный объект?   -  person OrangeDog    schedule 17.01.2014


Ответы (4)


Вы, вероятно, имеете в виду освобожденный (уничтоженный), а не освобожденный. Быть освобожденным не означает быть освобожденным, это точка отсчета при управлении памятью. Освобождение — это не состояние, его нельзя проверить; быть уничтоженным.

Если вы имеете в виду освобожденный, то нет, его нет. Это называется слабая ссылка, и в Objective-C их нет для подсчета ссылок. Когда объект освобождается, с указателями на него автоматически ничего не делается; они становятся оборванными указателями.

Один из методов заключается в том, чтобы объект отправлял уведомление во время освобождения, чтобы все, что содержит указатель, могло сбросить его до нуля.

Как правило, вы должны проектировать свою программу таким образом, чтобы ни один указатель объекта не использовался снова после того, как вы вызвали для нее release. В приведенном вами образце кода вы не должны снова использовать BuildView ни для чего другого, кроме присвоения нового значения.

person hamstergene    schedule 17.10.2011
comment
Следует отметить, что для исторических целей этот ответ уже неверен. У Objective-C есть слабые ссылки, и на самом деле они были всегда, при достаточном количестве взломов во время выполнения. Однако для официальной версии требуется iOS 5 и выше. - person Richard J. Ross III; 05.09.2012

Обычно вам не нужно проверять, указывает ли указатель на освобожденный объект: вы должны это знать :) Ваши переменные просто содержат адрес памяти. Если содержимое памяти, на которое указывает переменная, освобождается, значение вашей переменной (которая содержит адрес) не будет волшебным образом установлено на nil или NULL. Таким образом, вам следует переосмыслить свой дизайн, если вы считаете необходимым проверить, может ли указатель указывать на адресное пространство, которое уже было освобождено/освобождено.

Во время разработки вы можете активировать NSZombies или использовать Инструменты, чтобы узнать, где находятся объекты. распределяются или освобождаются.

Обновление от 26 июня 2015 г.: при использовании указателей weak в OS X 10.7 и более поздних версиях, а также в iOS 5 и более поздних версий они будут автоматически установлены на nil при освобождении объекта, на который ссылаются. См. https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References.

person Johannes Fahrenkrug    schedule 17.10.2011

После освобождения объекта значение этого объекта не будет установлено на nil.

person Parag Bafna    schedule 17.10.2011
comment
вызов retainCount для уничтоженного объекта приведет к сбою или другому неопределенному поведению, а не к нулю. - person hamstergene; 17.10.2011
comment
На самом деле, наиболее вероятным результатом в этом примере кода будет то, что retainCount вернет 1 даже если он был освобожден! - person Chuck; 17.10.2011

Благодаря "Какао с любовью" вы смогли это попробовать

http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html

person NicTesla    schedule 23.01.2014