如何检查对象是否已释放?

rde*_*fin 6 null memory-management objective-c

我需要能够检查我是否已经在objective-c中发布了一个变量.我试过检查它是否变为null:

//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");
Run Code Online (Sandbox Code Playgroud)

结果是:

Build View Value (pointer): Null
Build View Value (pointer): Not Null
Build View Value (pointer): Not Null
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来检查它是否被解除分配?

Joh*_*rug 7

通常,您不需要检查指针是否指向解除分配的对象:您应该知道:)您的变量只保存一个内存地址.如果取消分配变量指向的内存的内容,则变量(保存地址)的值不会神奇地设置为nil或NULL.因此,如果您发现有必要检查指针是否指向已经释放/取消分配的地址空间,那么您应该重新考虑您的设计.

在开发期间,您可以执行激活NSZombies或使用Instruments查找对象分配或取消分配的位置等操作.

2015年6月26日更新:当您weak在OS X 10.7及更高版本以及iOS 5及更高版本上使用指针时,它们将自动设置nil为释放引用对象时的指针.请参阅https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References


ham*_*ene 5

你可能意味着解除分配(被破坏),而不是被释放.被释放并不意味着被释放,这是引用内存管理的重点.被释放不是一个国家,你无法检查它; 被摧毁是.

如果你的意思是解除分配,那么不,没有.它被称为弱引用,而Objective-C没有它们用于引用计数.当一个对象被释放时,对它的指针不会自动执行任何操作; 他们成了悬空指针.

一种技术是让对象在解除分配期间发送通知,以便保存指针的所有内容都可以将其重置为nil.

通常,您必须以调用release它之后不再使用对象指针的方式设计程序.在您给出的示例代码中,BuildView除了分配新值之外,您不能再使用其他任何内容.

  • 应该注意的是,出于历史目的,这个答案不再正确。Objective-C 有弱引用,事实上,它总是这样做,有足够的运行时黑客。但是,对于正式版,它们需要 iOS 5 及更高版本。 (2认同)