我一直在阅读有关 RAII 和单阶段与两阶段构造/初始化的文章。无论出于何种原因,直到最近我都在两阶段阵营中,因为在某些时候我一定听说过在构造函数中进行容易出错的操作是不好的。但是,根据我在 SO 和其他文章中阅读的问题,我认为我现在确信单相更可取。
我的问题是:为什么 Objective C 几乎专门针对非便利构造函数使用两阶段方法(alloc/init)?语言中是否有任何特定原因,或者这只是设计师的设计决定?
最佳答案
我有幸为 1991 年编写 +alloc
的人工作,几个月前我碰巧问了他一个非常相似的问题。添加+alloc
是为了提供+allocWithZone:
,这是为了在内存非常紧张(4M)的NeXTSTEP 2.0中添加内存池。这允许调用者控制对象在内存中的分配位置。它是 +new
及其亲属的替代品,它是(并且继续是,尽管没有人使用它)基于 Smalltalk 的 new
的单阶段构造函数。当 Cocoa 来到 Apple 时,+alloc
的使用已经根深蒂固,并且没有回头到 +new
,即使实际上选择了你的 NSZone
很少有重要值(value)。
所以这不是一个大的 1-phase/2-phase 哲学问题。在实践中,Cocoa 具有单阶段构造,因为您总是(并且总是应该)在单个调用中连续调用这些,而无需对 +alloc
进行测试。您可以将其视为一种精心设计的输入“new”的方式。
关于objective-c - Objective C 对象的两阶段构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/948070/