objective-c - Objective C 对象的两阶段构建

标签 objective-c constructor initialization

我一直在阅读有关 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/

相关文章:

C# 编译器与委托(delegate)构造函数的奇怪之处

c++ - 是否有构造函数/析构函数方法的总称?

iOS 序列化/反序列化无法正常工作

ios - UITableView 点击一个项目打开一个新的屏幕/ View /事件

iphone - MPMoviePlayerViewController 从 Documents 目录播放电影 - objective-c

ios - 如何在iOS应用程序中添加Unity 3d的unity View?

java - 创建类时是否调用 Java 构造函数?没有创建对象时出现 "constructor cannot be applied to given types"错误

c++ - 默认构造函数是否初始化内置类型?

c++ - C++:为什么我必须以这种方式将声明声明为double?

asynchronous - AWS Lambda : Async Calls outside handler (initialization section, 调用 lambda)