【问题标题】:How to determine if I have a pointer to released object?如何确定我是否有指向已释放对象的指针?
【发布时间】:2012-09-05 11:51:04
【问题描述】:

在一个函数中,我正在处理一个有时可能已损坏的对象,在运行时,我能否以某种方式确定我的对象是否已损坏?

【问题讨论】:

    标签: objective-c xcode debugging


    【解决方案1】:

    真正做到这一点的唯一方法是利用称为__weak 指针的ARC(和iOS 5,在此之前不起作用)的新东西。

    还应注意,根据定义,__weak 变量不保留。如果__weak 变量保留了它的目标,那么根据定义,它不能释放自己。

    基本上,__weak 指针是一个变量,当它被释放时会自动将其自身设置为NULL。因此,您可以执行以下操作来确定对象是否被释放:

    __strong id object; // required so that the object doesn't get deallocated right away
    __weak id _weakRef;
    
    object = [NSObject new];
    _weakRef = object;
    
    // do stuff with 'object'
    
    if (_weakRef)
    {
        // 'object' hasn't been deallocated yet, do something with it.
    }
    

    通常来说,您不会保留对对象的强引用和弱引用,因为这会导致 _weakRef 无用(只需检查您何时将 object 设置为 nil)。

    我还告诫不要使用仅基于__weak 变量的设计模式,尤其是在您制作框架的情况下。没有什么比将 iOS 5 用作目标部署更能说明“烦人”了。

    我希望这篇文章能帮助您更深入地了解弱引用的工作原理,如果没有,您可以在此处阅读一篇出色的维基百科文章:

    http://en.wikipedia.org/wiki/Weak_reference

    【讨论】:

    • +1 是这个问题的许多重复项的唯一正确答案。
    【解决方案2】:

    简短的回答,不,没有办法判断您的对象是否已被释放。更多解释,请查看this question

    【讨论】:

    • 我是 -1,因为它没有考虑 ARC 和新的 __weak 变量。
    【解决方案3】:

    假设该对象是NSObject,只需在 Instruments 中启用 Zombies。然后你所要做的就是向有问题的对象发送消息。当您向它发送消息时,它会通知您该对象是否已死亡。

    【讨论】:

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