Iphone 目标C:对象不是零,而是空的

Iphone 目标C:对象不是零,而是空的,iphone,ios,objective-c,null,is-empty,Iphone,Ios,Objective C,Null,Is Empty,在我的应用程序中,经过一些异步操作后,我正在调用指向我的ViewController中的方法的选择器。 有时,在执行asynch操作之后,此ViewController已被解除分配。 我的问题是如何检查ViewController是否已解除分配? 我可以作为Id变量访问它。简单地检查它是否为nil不起作用。 这是视图控制器的正确值: 但这一个会导致崩溃: 我怎样才能检查它是空的还是类似的东西?我是新来的ObjectiveC,所以这可能看起来像一个外行问题,但请帮忙。谢谢您的回答。尝试使用或完

在我的应用程序中,经过一些异步操作后,我正在调用指向我的
ViewController
中的方法的选择器。 有时,在执行
asynch
操作之后,此
ViewController
已被
解除分配
。 我的问题是如何检查
ViewController
是否已解除分配? 我可以作为
Id
变量访问它。简单地检查它是否为
nil
不起作用。 这是
视图控制器的正确值:

但这一个会导致崩溃:


我怎样才能检查它是空的还是类似的东西?我是新来的
ObjectiveC
,所以这可能看起来像一个外行问题,但请帮忙。谢谢您的回答。

尝试使用或完成块

您可能希望研究使用弱属性-当引用的对象被解除分配时,这些属性应该为零。这个问题的答案应该是有用的:

我的问题是如何检查ViewController是否已解除分配

答案是你不能(但是,见下文)。当对象被解除分配时,所发生的一切就是它的存储返回到堆上以便重用。记忆的内容不会发生任何变化。因此,您的id指针可以指向原始的未解除分配的对象、原始的但已解除分配的对象、重新使用存储的新对象,或者只是垃圾

解决这个问题的老方法是视图控制器(委托)拥有执行委托的对象(无论它执行异步操作是什么)。然后,当视图控制器被解除分配时,视图控制器将在执行委托的对象上取消委托属性(这将是一个赋值属性)


对于ARC,除了进行委托的对象上的delegate属性是一个属性外,它的排列方式是相同的,这意味着当委托被解除分配时,ARC将自动将其置零。

非常感谢您的回答。我还有一个问题。取消分配对象并进行委派怎么样?它是在我的ViewController中创建的。而ViewController调用了异步操作,并且在操作完成之前,它已将委托设置为nil并自行解除分配。当委派对象的异步操作完成时,我应该在哪里解除委派对象的锁定?