在Objective C中,测试对象是否在内存中的好方法是什么?
我一直在使用这样的代码:
if(myObject){
[myObject stop];
}
但尽管如此,我仍然EXC_BAD_ACCESS
在运行停止消息的行上不断收到错误myObject
。
任何人都可以提出更好的测试方法是否myObject
仍然存在并且能够接收消息?
在Objective C中,测试对象是否在内存中的好方法是什么?
我一直在使用这样的代码:
if(myObject){
[myObject stop];
}
但尽管如此,我仍然EXC_BAD_ACCESS
在运行停止消息的行上不断收到错误myObject
。
任何人都可以提出更好的测试方法是否myObject
仍然存在并且能够接收消息?
您不能以这种方式进行测试,因为您真正检查的只是指针是否为零,显然不是。
查看 ARC 的弱引用,一旦对象被释放,系统会自动将其归零。
更重要的是,在很多情况下,内存被重用,而不是错误的访问,你可能会得到一个unrecognized selector sent to instance
异常。在那种情况下,任何可能的NSIsPointerStillValidForSendingSelectors(myObject)
都会返回YES
,但它仍然不是你的对象。
为避免出现悬空指针的情况,您总是将对象引用设为 nil 。
[myObject release];
myObject = nil ;
然后之后下面的代码将根据您的需要工作
if(myObject != nil)
{
[myObject stop];
}
实际上,Objective-Cnil
在向对象发送消息时会自动进行测试,因此以下内容实际上是等价的:
[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