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

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

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

Ответы [ 4 ]

7 голосов
/ 17 октября 2011

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

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

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

5 голосов
/ 17 октября 2011

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

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

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

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

0 голосов
/ 23 января 2014

Благодаря «Какао с любовью» вы можете попробовать это

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

0 голосов
/ 17 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...