【问题标题】:after calling TNSMutableDictionary.Create do we need to call release?在调用 NSMutableDictionary.Create 之后我们需要调用 release 吗?
【发布时间】:2018-12-13 07:58:36
【问题描述】:

在阅读了 Dalija Prasnikar iOS objective-c object: When to use release and when to not use it 的精彩帖子后,我了解到:

名称以 alloc、new、copy 或 mutableCopy 开头的方法不会 要求电话保留。相反,如果你调用它,你会 创建内存泄漏,因为会有一个保留太多。但 它们确实需要释放或自动释放。这些对象实例是 你创建的那些,在 Objective-C 下它们是自动的 构建时保留。

但是 create 呢?例如做myDict: = TNSMutableDictionary.Create,我需要稍后打电话给myDict.release吗?

两者有什么区别

TNSMutableDictionary.Wrap(TNSMutableDictionary.Wrap(TNSMutableDictionary.OCClass.alloc).init);

TNSMutableDictionary.Create?

【问题讨论】:

    标签: ios delphi firemonkey


    【解决方案1】:

    简答:是的,如果您使用CreateTNSMutableDictionary.Create),则需要致电release

    对于对象的构造,你使用哪种变体并不重要,但更短的总是更易读。而且你可以在你的 Objective-C 版本中进行许多包装。


    构建对象实例 Delphi vs Objective-C

    在 Objective-C 上构造对象的过程与 Delphi 对象实例的构造过程。

    虽然 Delphi 通过调用构造函数来一次性构造对象,该构造函数触发对象实例的内存分配然后初始化对象,但在 Objective-C 中该过程分为两个步骤。一种是内存分配,通过 alloc 方法,接下来是通过各种名为 init 的初始化 方法。这两者都是 Delphi 构造函数的不同部分的近似等价物。

    但这还不是全部。 Objective-C 也有new,它一次性结合了allocinit,类似于Delphi 的构造函数。但是,new 仅调用默认构造函数,如果您需要使用自定义构造函数,则需要使用 alloc + initxxx 变体。为了代码的一致性,Objective-C 开发人员通常更喜欢alloc + init,即使他们可以使用new

    Objective-C 对象的 Delphi 包装器

    Delphi 通过通用包装类将 Objective-C 对象作为原始指针访问。该类提供了几个类方法来更容易地实例化 Objective-C 对象。

    Create 相当于调用alloc.initnew,并调用默认值 初始化,而Alloc相当于调用alloc,之后我们必须调用适当的初始化例程——一些initxxx或默认init

    Wrap 方法用于包装操作系统提供的已构建对象实例并保持该对象实例处于活动状态,我们必须调用retain,完成后release

    但是,如果您使用Wrap 只是将您创建的对象实例alloc.init 变体或new 一起包装,那么您不应调用retain,而必须调用release.

    【讨论】:

    • 感谢@dalija,所以所有 firemonkey delphi 源代码都存在内存泄漏问题 :( 只需查看 TNSMutableDictionary.Create,您会发现它们从不调用 release :( 与所有其他 NS* 相同**.create,他们从不(或很少)调用 release :(
    • 一切皆有可能...问题是当您在 Objective-C 中编写代码时,ARC 在那里完成了它的工作,您不必调用保留和释放。因此,您可以创建字典并将其传递,而无需再考虑它。但是 Delphi ARC 与 iOS/macOS ARC 是分开的,如果您在 Delphi 端构造对象,OS ARC 依赖于您发出信号,何时可以安全释放它。当您将该对象传递回某些 OS API 时,它只能进行间歇性引用计数 - 但该计数不会成为最终版本。
    • 为了安全起见,我有双重、检查和三重检查,是的,你必须打电话给release,否则你会泄露字典。
    • 谢谢,@dalija ...我将在 quality.embarcadero.com 上创建一份关于所有这些内存泄漏的错误报告
    • 请注意,Delphi 的移动平台上类对象的 ARC 将是 going away in 10.4,因此正确的内存管理将变得更加重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2011-09-14
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多