在目标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