为什么使用initWith ..方法而不是"类/工厂方法"在Objective-C?

时间:2015-07-04 14:39:08

标签: cocoa constructor

我已经在Objective-C中编写了几个月的编码,而且我注意到有时会使用init方法对类进行实例化(如文档所推荐)。因此,必须首先分配,然后是init。 [[Example Class Alloc] initWithProperty1:andTwo:]。但是,有时文档建议使用"工厂方法"作为建设者。例如[NSArray arrayWithObjects:__]。

似乎使用工厂/类方法可以在幕后完成分配,实际方法与init,AFAIK无法区分。

因此,选择一个而不是另一个的实际原因是什么?我对这两者的分析是否几乎相同甚至是正确的?

1 个答案:

答案 0 :(得分:2)

我建议使用工厂方法,如果有的话可以满足您的需要。除了句法糖(更短),对象的所有权也有差异(因此谁应该释放它)。如果你使用ARC,你不应该担心内存。

来自Apple's documentation

  

工厂方法可以简单方便。他们不能   只合并分配和初始化,但分配可以   通知初始化。举个例子,假设你必须这样做   从编码的属性列表文件初始化集合对象   集合的任意数量的元素(NSString对象,NSData   对象,NSNumber对象等)。在工厂方法之前可以   知道要为集合分配多少内存,它必须阅读   文件并解析属性列表以确定那里有多少元素   是和这些元素的对象类型。

这有点神秘,但请考虑这样的用例:您希望用文件内容填充NSMutableArray。如果选择" alloc和init",操作系统必须不断分配新内存,以便在从文件中读取附加数据时存储附加数据。类方法需要首先解析文件,因此它知道有多少行以及它应该一次性请求的内存大小。