【问题标题】:Objective-c: know if memory location was deallocatedObjective-c:知道内存位置是否被释放
【发布时间】:2012-06-27 16:43:20
【问题描述】:

我已经为 iOS 项目实现了一个下载器。它接受请求,并在下载完成后通过委托响应目标。它是异步的,并且目标(显然)是一个弱引用,所以当下载完成时,如果目标不再被分配,我有一个 bad_acces。 我已经解决了添加一个在所有请求中搜索目标并将其设置为 nil 的方法(在释放使用它的对象时调用)。 这与我想要的行为相去甚远(完全独立于其他对象:如果不再请求下载,它将被缓存:它没有停止下载的方法,只有一个优先级队列) 有一种安全的方法可以知道指针是否仍然指向有效的内存地址?

【问题讨论】:

  • 如果引用是weak并且你在ARC中运行,那么理论上,当对象被删除时引用应该设置为nil
  • 感谢回复:还是有用的。下载器是非 arc 库的一部分,但我将其包含在 ARC 项目中。
  • 弱引用并不意味着 ARC 之外的任何东西,不是吗?使用 ARC,它们仅在 OS X 10.7 及更高版本和 iOS 5 及更高版本上受支持。
  • 对不起,我的错。我的意思是“不保留”而不是弱

标签: objective-c ios xcode pointers


【解决方案1】:

在回答您的问题时,没有一种好方法可以知道指针是否仍然有效(僵尸除外,它不是生产环境解决方案,只是一个测试环境工具)。而是担心“我怎么知道这是否是一个悬空指针”,你应该首先不允许出现悬空指针。

当您的下载器被创建时,您大概指定了一个委托。当代理对象即将消失时(例如在其dealloc 中),它应该告诉下载器将其代理属性设置为nil,从而消除悬空指针。

【讨论】:

  • 这是当前行为。抱歉这个愚蠢的问题,我已经认为这是正确的方法,但我希望能够完全分离对象行为。现在我知道这只能在 ARC 上实现,谢谢。
【解决方案2】:

分析您的代码。专门使用仪器来检查内存泄漏。此外,使用分析来检测可能存在问题的部分。使用不同的工具,它们对开发有很大帮助。

【讨论】:

    【解决方案3】:

    仅通过查看指针指向的内存位置,没有安全的方法可以知道它是否仍然指向有效内存(无需编写您自己的内存管理器)。

    为什么不在您的代码中保留/释放委托?这将是设计它的正确方法。此外,为您的代码的用户提供将自己从您的委托列表中删除的方法。

    【讨论】:

    • 感谢您的建议。我是这么认为的,但不确定。由于队列的原因,我不保留委托:如果有很多任务(具有更高的优先级),它可以保留很长时间
    • 不要保留代表。委托可能已经保留了委托对象。因此,您将能够摆脱这两个对象,并且它们将相互维护。并且不会解除分配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多