Cocoa 框架为什么采用两阶段的方式来创建对象?

  对于之前一直使用C#语言的我来说,刚开始接触Objective-c来创建对象时很迷惑,为何创建对象一般情况下需要通过发送两个消息(调用两个方法)才能创建一个类实例对象(例如[[UIButton alloc] init])?相信使用Java的也会有这样的感受,给个类型调用一下初始化方法不就完了吗?真是麻烦!虽然Objective-c中也有采用new一步到位的(例如:[UIButton new]),但是这种用法貌似不是很常见。水果公司这么做肯定是有道理的。下面我们先讨论一下采用直接创建的方式有何利弊。

  上文提到,我们可以通过[UIButton new]的方式创建一个对象,实质上这个消息内部调用的也是[[UIButton alloc] init]。说明通过new方式创建的对象都是采用默认的alloc方式从堆中分配内存。这么做从结果上来讲,当然是可以正确的创建出一个对象的,但是同样这也扼杀了c语言中其它的分配内存的方式。试想一下这种情况,假定能够以进程间共享特殊内存或者映射到计算机虚拟地址空间的内存来存储图片,而不是以默认的方式在内存中进行分配,那么上面那种方式就不够合适。或许你会说,我可以新建下面两个方法:

+ (instancetype)imageWithVirtualMemory:(VirtualMemory *)memory;
+ (instancetype)imageWithSharedMemory:(SharedMemory *)memory;

  当然代码中的VirtuaMemory和SharedMemory是虚拟的两个类。我们可以不用太过关注。

  这么做似乎解决了问题,但是这仅仅是分配方式的两种变化,init方法也可以有多种变化,假如一个类现在有5种alloc方式,以及8种init方式。如果合并在一个方法中创建对象的话,这就意味着我们需要创建5*8=40种创建对象的方式。介绍到这里,我相信我们已经有了一个理由让我们采用两阶段创建的方式。

原文地址:https://www.cnblogs.com/forwk/p/4821459.html