Мне нужно иметь возможность проверить, выпустил ли я уже переменную в 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
Есть ли более простой способ проверить, освобожден ли он?
Ответ 1 · рейтинг 5 · hamstergene
Вы, вероятно, имеете в виду освобожденный (уничтоженный), а не освобожденный. Быть освобожденным не означает быть освобожденным, это точка отсчета при управлении памятью. Освобождение - это не состояние, его нельзя проверить; быть уничтоженным.
Если вы имеете в виду освобожденный, то нет, его нет. Это называется слабая ссылка, и в Objective-C их нет для подсчета ссылок. Когда объект освобождается, с указателями на него автоматически ничего не делается; они становятся оборванными указателями.
Один из методов заключается в том, чтобы объект отправлял уведомление во время освобождения, чтобы все, что содержит указатель, могло сбросить его до нуля.
Как правило, вы должны проектировать свою программу таким образом, чтобы ни один указатель объекта не использовался снова после того, как вы вызвали для нее release. В приведенном вами образце кода вы не должны снова использовать BuildView ни для чего другого, кроме присвоения нового значения.
Ответ 2 · рейтинг 7 · Johannes Fahrenkrug
Обычно вам не нужно проверять, указывает ли указатель на освобожденный объект: вы должны это знать :) Ваши переменные просто содержат адрес памяти. Если содержимое памяти, на которое указывает переменная, освобождается, значение вашей переменной (которая содержит адрес) не будет волшебным образом установлено на nil или NULL. Таким образом, вам следует переосмыслить свой дизайн, если вы считаете необходимым проверить, может ли указатель указывать на адресное пространство, которое уже было освобождено/освобождено.
Во время разработки вы можете активировать NSZombies или использовать Инструменты, чтобы узнать, где находятся объекты. распределяются или освобождаются.
Обновление от 26 июня 2015 г.: при использовании указателей weak в OS X 10.7 и более поздних версиях, а также в iOS 5 и более поздних версий они будут автоматически установлены на nil при освобождении объекта, на который ссылаются. См. https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References.