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

时间:2013-10-22 07:58:37

标签: objective-c

在Objective C中,测试一个对象是否在内存中的好方法是什么?

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

if(myObject){
    [myObject stop];
}

但是尽管如此,我仍然在EXC_BAD_ACCESS上运行停止消息的行上出现myObject错误。

如果myObject仍然存在且能够接收消息,是否可以建议更好的测试方式?

3 个答案:

答案 0 :(得分:2)

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

查看ARC的弱引用,一旦取消分配对象,系统就会自动为零。

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

答案 1 :(得分:2)

为避免悬空指针情况,您总是将nil设为对象引用

[myObject release];

myObject = nil ;

之后,以下代码将根据您的愿望工作

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

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

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

答案 2 :(得分:1)

myObject现在正指向垃圾,因此会发送消息,应用程序将崩溃,因为它不再是您认为的对象。

如果您想检查是否可以收到某条消息,可以使用:

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

或者将其设置为nil并使用以下方法检查指针是否仍指向其他对象:

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