我一直在读RAII和单相与两相构造/初始化.无论出于何种原因,我直到最近一直处于两阶段阵营,因为在某些时候我一定听说过在构造函数中执行容易出错的操作是不好的.但是,我认为我现在确信单相是可取的,基于我在SO和其他文章中读过的问题.
我的问题是:为什么Objective C几乎专门为非便利构造函数使用两阶段方法(alloc/init)?这种语言有什么特定的原因,还是只是设计师的设计决定?
我有一个令人羡慕的情况,那就是+alloc
在1991年写回来的那个人,几个月前我偶然问他一个非常相似的问题.添加+alloc
是为了提供+allocWithZone:
,这是为了在NeXTSTEP 2.0中添加内存池,内存非常紧张(4M).这允许调用者控制在内存中分配对象的位置.这是一个替代+new
和它的亲属,它是(并且仍然是,虽然没有人使用它)一个基于Smalltalk的单相构造函数new
.当Cocoa来到Apple时,使用+alloc
已经根深蒂固,并且没有回头+new
,即使实际选择你NSZone
很少有重要价值.
所以这不是一个很大的单阶段/两阶段哲学问题.在实践中,Cocoa具有单阶段构造,因为你总是(并且总是应该)在一次调用中背对背地调用它们而不对其进行测试+alloc
.您可以将其视为一种精心设计的"新"输入方式.