在Objective C中,测试一个对象是否在内存中的好方法是什么?
我一直在使用这样的代码:
if(myObject){
[myObject stop];
}
但是尽管如此,我仍然在EXC_BAD_ACCESS
上运行停止消息的行上出现myObject
错误。
如果myObject
仍然存在且能够接收消息,是否可以建议更好的测试方式?
答案 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