Objective-C:对象不是空的,而是空的

时间:2013-10-01 11:46:43

标签: iphone ios objective-c null is-empty

在我的应用程序中,经过一些异步操作后,我正在调用指向我ViewController中方法的选择器。 有时它会发生,ViewControllerdeallocated操作之后已经asynch。 我的问题是如何检查ViewController是否已经解除分配? 我可以将其作为Id变量访问。简单检查它是否nil不起作用。 这是ViewController

的正确值

enter image description here

但这会导致崩溃:

enter image description here 我怎样才能检查它是否为空或类似?我是ObjectiveC的新手,所以看起来像是一个外行问题,但请帮助。谢谢你的回答。

3 个答案:

答案 0 :(得分:1)

您可能想要使用弱属性进行调查 - 当被引用的对象被释放时,这些属性应该自行解决。这个问题的答案应该是有用的:

Differences between strong and weak in Objective-C

答案 1 :(得分:0)

尝试使用DELEGATE或完成块

答案 2 :(得分:0)

  

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

答案是你不能(但是,见下文)。当对象被释放时,所发生的一切就是它的存储在堆上返回以便重用。内存的内容没有任何变化。所以你的id指针可以指向原始的非释放对象,原始对象但是已经解除分配,一个新的对象已经重用了存储或只是垃圾。

解决这个问题的方法是让视图控制器(委托)拥有执行委托的对象(不管它是在进行异步操作)。在视图控制器被取消分配时,视图控制器将对执行委托的对象nil委托属性(这将是一个assign属性)。

使用ARC时,除了执行委托的对象上的委托属性是属性之外,它是相同的排列,这意味着当委托被取消分配时,ARC将自动将其置零。