在阅读了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
吗?
答案 0 :(得分:2)
简短答案:是的,如果您使用过release
(Create
),则需要致电TNSMutableDictionary.Create
对于对象的构造,使用哪个变体并不重要,但是较短的总是更易读。而且您可以在Objective-C版本中进行许多包装。
在Objective-C上构造对象的过程与 构造Delphi对象实例的过程。
在Delphi中,通过调用触发对象实例的内存分配然后初始化对象的构造函数来一次性构造对象,在Objective-C中,该过程分为两个步骤。一种是内存分配
alloc
方法,接下来是通过各种命名的init
完成的初始化
方法。两者都是Delphi构造函数不同部分的近似等效项。
但这还不是全部。 Objective-C还具有new
,它一口气将alloc
和init
组合在一起,类似于Delphi构造函数所做的。但是,new
仅调用默认构造函数,如果需要使用自定义构造函数,则需要使用alloc
+ initxxx
变体。为了保持代码的一致性,即使可以使用alloc
,Objective-C开发人员也通常更喜欢init
+ new
。
Delphi通过通用包装类将Objective-C对象作为原始指针访问。该类提供了几种类方法,可以更容易地实例化Objective-C对象。
Create
等效于调用alloc.init
或new
,并调用默认值
初始化,而Alloc
相当于调用alloc
,此后我们必须调用适当的初始化例程-一些initxxx
或默认的init
Wrap
方法用于包装由OS提供的已经构造的对象实例,并使该对象实例保持活动状态,我们必须调用retain
,然后完成release
。
但是,如果您仅使用Wrap
来包装您使用alloc.init
变体或new
来包装创建的对象实例,则不应调用{{ 1}},则必须致电retain
。