调用TNSMutableDictionary.Create之后,我们需要调用release吗?

时间:2018-12-13 07:58:37

标签: ios delphi firemonkey

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

  

名称以alloc,new,copy或mutableCopy开头的方法不   需要致电保留。相反,如果您称它为   造成内存泄漏,因为其中一个保留太多。但   他们确实需要发布或自动发布。这些对象实例是   您创建的,并且在Objective-C下自动   构造时保留。

但是创建如何?例如myDict: = TNSMutableDictionary.Create,我以后需要打电话给myDict.release吗?

两者之间到底有什么区别

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

TNSMutableDictionary.Create吗?

1 个答案:

答案 0 :(得分:2)

简短答案:是的,如果您使用过releaseCreate),则需要致电TNSMutableDictionary.Create

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


构造对象实例Delphi与Objective-C

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

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

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

用于Objective-C对象的Delphi包装器

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

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

Wrap方法用于包装由OS提供的已经构造的对象实例,并使该对象实例保持活动状态,我们必须调用retain,然后完成release

但是,如果您仅使用Wrap来包装您使用alloc.init变体或new来包装创建的对象实例,则不应调用{{ 1}},则必须致电retain