Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: rdelfinОтветов: 4

Мне нужно иметь возможность проверить, выпустил ли я уже переменную в 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

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

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

objective-cnullmemory-management

Ответы

Ответ 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.

Ответ 3 · Parag Bafna

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

Ответ 4 · NicTesla

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы