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

Objective c 如何检查对象是否已释放?,objective-c,memory-management,null,Objective C,Memory Management,Null,我需要能够检查我是否已经在objective-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 memor

我需要能够检查我是否已经在objective-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

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

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

在开发期间,您可以执行诸如激活或使用工具之类的操作,以找出对象被分配或解除分配的位置


更新6/26/2015:当您在OS X 10.7及以上版本和iOS 5及以上版本上使用
指针时,释放引用对象时,它们将自动设置为
nil
。请参见

释放对象后,该对象的值将不会设置为
nil

您可能指的是解除分配(销毁),而不是释放。释放并不意味着释放,这是参考点计数内存管理。被释放不是一种状态,你不能检查它;被摧毁是一种痛苦

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

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

通常,在设计程序时,必须确保在调用
release
后不会再次使用对象指针。在您给出的示例代码中,除了指定一个新值外,您不能再使用
BuildView
执行任何其他操作。

多亏了“Cocoa with Love”,您可以尝试此操作


您似乎要问的不是对象是否已释放,而是它是否已被释放。对已销毁对象调用
retainCount
的可能重复将导致崩溃或其他未定义的行为,而不是零。事实上,该特定代码示例中最有可能的结果是,
retainCount
即使在解除分配时也会返回1!应该指出的是,从历史的角度来看,这个答案不再正确。Objective-C的引用很弱,事实上,它总是这样,运行时的黑客攻击已经够多了。但是,对于官方版本,它们需要iOS 5及更高版本。