如何测试对象以查看它是否仍然可以接收消息以避免EXC_BAD_ACCESS



在目标C中,测试对象是否在内存中的好方法是什么?

我一直在使用这样的代码:

if(myObject){
    [myObject stop];
}

但尽管如此,我仍然在myObject上运行停止消息的行上不断收到EXC_BAD_ACCESS错误。

有人能提出一种更好的方法来测试myObject是否仍然存在并且能够接收消息吗?

你不能用这种方式测试,因为你真正检查的只是指针是否为零,而这显然不是。

查看 ARC 的弱引用,一旦对象被解除分配,系统就会自动将其归零。

更重要的是,在很多情况下,内存被重复使用,而不是错误的访问,您可能会得到unrecognized selector sent to instance异常。在这种情况下,任何可能的NSIsPointerStillValidForSendingSelectors(myObject)都会返回YES,但它仍然不是你的对象。

为了避免指针悬空的情况,你总是对对象引用做零

[myObject release];
myObject = nil ;

然后,下面的代码将根据您的意愿工作

if(myObject != nil)
{
    [myObject stop];
}

事实上,Objective-C 在向对象发送消息时会自动测试nil,因此以下内容实际上是等效的:

[myObject stop]; // If myObject is nil, this statement will not do anything.

myObject现在指向垃圾,所以它会发送一条消息,应用程序会崩溃,因为它不再是你认为的对象了。

如果要检查它是否可以接收特定消息,可以使用:

if ( [myObject respondsToSelector:@selector(mySelector)] ){ ....  

或者将其正确设置为 nil 并使用以下命令检查指针是否仍指向其他地方的对象:

if ( myObject ){   ... //If myObject is not nil

相关内容

最新更新