【问题标题】:How to check an object is released in firemonkey?如何检查对象是否在firemonkey中释放?
【发布时间】:2015-07-06 10:13:08
【问题描述】:

我创建了一个组件并在其他地方使用它,但我不知道该组件是否已发布。

那么如何在使用前检查一个对象是否被释放?

谢谢。

【问题讨论】:

  • 对于TComponent 后代解决方案将使用FreeNotification。如果只有一个对该对象的引用,则在释放后将引用重置回nil 是另一种方法。
  • 您能否提供更多关于您想要实现的目标的信息,以及您的目标是移动、桌面编译器还是两者兼而有之。
  • 也许这涵盖了你所需要的How can I detect that a component has been freed?

标签: delphi object firemonkey


【解决方案1】:

我假设您的目标是移动编译器,否则 ARC 不会被使用,那么问题似乎毫无意义。

测试Disposed 属性。

Disposed 是一个只读属性,显示了 this 的当前状态 对象。

如果对象已被释放,则 Disposed 属性返回 True 使用 DisposeOf 方法。否则,它返回 False。

但是,您甚至可能会问这个问题似乎很奇怪。也许你没有以最好的方式解决你的问题。

【讨论】:

  • 反对票有什么用?我已经做好了犯错的准备。
  • @DalijaPrasnikar 谢谢。我假设是移动编译器,现在已经说明了这一点。我同意这闻起来很糟糕。
  • Disposed 属性用于临时调试工具之外的任何东西,真的是非常糟糕的编码习惯。如果需要检查是否使用Disposed 释放了对象,则必须以不需要此类检查的方式更改代码。
  • @Dalija 我同意。我说了这么多。
  • 我强烈反对使用Disposed,我觉得有必要让它比你的回答显示的更明显。特别是,因为它的问题看起来更像是“如何做到这一点”而不是“如何调试我的代码”。
【解决方案2】:

在阅读了您的其他问题后,您似乎正在尝试在 OSX 上调试内存问题,并且您正在尝试找出已释放但仍在使用的对象。

我建议使用开启完全调试模式的 FastMM4。不要忘记将 libFastMM_FullDebugMode.dylib 与您的项目一起部署,以便使用 FastMM4 进行调试。如果您尝试访问已被释放的对象,这将引发异常。

【讨论】:

    【解决方案3】:

    对类的引用是“活动的”,直到您清除对它的所有引用。 如果你不使用像 DisposeOf 这样的脏方法,或者使用弱引用。

    最好的方法 - 使用 TDictionary。 在构造函数中添加类的地址,在析构函数中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 2017-02-16
      • 2011-08-09
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多