Objective c 如何测试一个对象,看它是否仍然可以接收消息,以避免EXC\u BAD\u访问?

Objective c 如何测试一个对象,看它是否仍然可以接收消息,以避免EXC\u BAD\u访问?,objective-c,Objective C,在目标C中,什么是测试对象是否在内存中的好方法 我一直在使用这样的代码: if(myObject){ [myObject stop]; } 但尽管如此,在myObject上运行停止消息的行上,我仍然不断收到EXC\u BAD\u ACCESS错误 有谁能建议一种更好的方法来测试myObject是否仍然存在并且能够接收消息吗?您不能用这种方法进行测试,因为您真正检查的是指针是否为零,而它显然不是 查看ARC的弱引用,一旦对象被释放,系统会自动将其设置为零 此外,在许多情况下,内存被重用,

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

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

if(myObject){
    [myObject stop];
}
但尽管如此,在
myObject
上运行停止消息的行上,我仍然不断收到
EXC\u BAD\u ACCESS
错误


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

您不能用这种方法进行测试,因为您真正检查的是指针是否为零,而它显然不是

查看ARC的弱引用,一旦对象被释放,系统会自动将其设置为零


此外,在许多情况下,内存被重用,而不是错误的访问,您可能会得到一个
无法识别的选择器发送到实例
异常。在这种情况下,任何可能的
nsispInterstillValidForEndingSelectors(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)] ){ ....  
或将其正确设置为零,并使用以下命令检查指针是否仍指向其他位置的对象:

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

我不想创建对对象的弱引用。我想测试一个对象是否仍然可以接收消息。你知道怎么做吗?@Jimmey:这是不可能的。您拥有的是一个悬空指针,例如指向内存中某个部分的指针,其中可能有对象,也可能没有对象。试着弄清楚为什么你有一个指向解除分配对象的指针。@GeorgSchölly你认为
响应选择器:
会起作用吗?@jimmey:不,不可能。你的问题的解决办法是找出为什么在你还在使用的时候对象被释放了。我不明白弱引用的问题是什么。它完全满足了您的需要。我应该说我使用的是ARC