2

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

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

if(myObject){
    [myObject stop];
}

但尽管如此,我仍然EXC_BAD_ACCESS在运行停止消息的行上不断收到错误myObject

任何人都可以提出更好的测试方法是否myObject仍然存在并且能够接收消息?

4

3 回答 3

2

您不能以这种方式进行测试,因为您真正检查的只是指针是否为零,显然不是。

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

更重要的是,在很多情况下,内存被重用,而不是错误的访问,你可能会得到一个unrecognized selector sent to instance异常。在那种情况下,任何可能的NSIsPointerStillValidForSendingSelectors(myObject)都会返回YES,但它仍然不是你的对象。

于 2013-10-22T08:02:21.527 回答
2

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

[myObject release];

myObject = nil ;

然后之后下面的代码将根据您的需要工作

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

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

[myObject stop]; // If myObject is nil, this statement will not do anything.
于 2013-10-22T08:59:12.083 回答
1

myObject现在指向垃圾,所以它会被发送一条消息并且应用程序将崩溃,因为它不再是你认为的对象。

如果你想检查它是否可以接收到某个消息,你可以使用:

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

或者将其正确设置为 nil 并使用以下命令检查指针是否仍指向其他地方的对象:

if ( myObject ){   ... //If myObject is not nil
于 2013-10-22T09:05:29.433 回答