【问题标题】:Querying to an instance if it is already deallocated查询一个实例是否已经被释放
【发布时间】:2011-07-01 23:47:22
【问题描述】:

我知道内存管理规则,如果我遵循这些规则,就不需要我问什么。但是,我想知道是否有办法知道一个实例是否已经被释放而不抛出异常。 我的应用程序使用一个对象,我的应用程序上的任何视图都可以成为它的委托。有时,我会遇到这个众所周知的错误。我可以通过在当前委托所有者的 dealloc 方法上将委托设置为 nil 来避免这种情况。 总之......我有什么办法知道一个对象是否被释放?

谢谢。

【问题讨论】:

    标签: iphone objective-c sdk


    【解决方案1】:

    我可以判断一个指针现在是否指向垃圾吗?

    不,不是真的。一旦一个对象被释放,它的内存就可以在任何时候被重用。有时它实际上会指向垃圾(导致崩溃),有时它会指向不同的 Obj-C 对象,有时内存还没有被重用。

    主要的例外是如果你设置了环境变量NSZombieEnabled=YES(在Xcode 4的“编辑方案”中),对象使用的内存永远不会被释放(除非你也设置了NSDeallocateZombies=YES,左右) ;相反,向僵尸发送消息会导致异常。它对调试很有用,主要是因为它告诉您被释放的实例的类名。

    【讨论】:

    • 好的,我明白了。但是我仍然想知道为什么我没有类似 try-catch 的东西,或者任何告诉我“嘿!你现在在这个指针上没有什么可以使用的东西,你想自己处理这个错误吗?”而不仅仅是崩溃。您知道,有时将代表处处指向 nil 是很烦人的。只是一个想法。谢谢你的回答。
    【解决方案2】:

    一旦底层对象被释放,我通常会尝试将指针设置为nil。在这种情况下,您可以简单地检查指针是否为nil 以查看对象是否已被释放。这并不总是可能的,但经常是。

    【讨论】:

      【解决方案3】:

      您的问题的答案是明确的“不”。您不能在不冒因指针访问无效而导致崩溃的情况下询问指针是否有效。好消息是,将委托对象设置为 nil 是正确的做法,因此您目前正在做的事情很好。

      【讨论】:

        猜你喜欢
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2013-08-20
        相关资源
        最近更新 更多