objective-c - 为什么 alloc 和 init 在 Objective-C 中分开调用?

标签 objective-c cocoa oop init alloc

注意:我是 Objective-C 的新手,来自 Java 和 PHP。

有人可以向我解释为什么我总是必须先分配然后初始化实例吗?

这不能像这样在初始化方法中完成吗:

+ (MyClass*)init {
    MyClass *instance = [MyClass alloc];
    [instance setFoo:@"bla"];

    return instance;
}

+ (MyClass*)initWithString:(NSString*)text {
    MyClass *instance = [MyClass init];
    [instance setFoo:text];

    return instance;
}
...

这只是旧 C 时代的遗留物还是有什么我没有看到的东西?

我知道这不是问题,因为我也可以总是调用 alloc 和 init,但由于这有点乏味,我想至少知道我为什么要这样做。

到目前为止,我喜欢这门语言的表现力,但这是我想要完全理解的东西,以便以 Objective-C 的方式思考。

谢谢!

最佳答案

+new 最终向类发送一条 +alloc 消息,并向从 +alloc 返回的任何内容发送一条 -init 消息。

NeXT 之所以背离 Stepstone 使用 +new 消息的惯例(这是 Smalltalk 的想法),是因为在早期,他们遇到了希望能够多次初始化同一个对象的情况。

关于objective-c - 为什么 alloc 和 init 在 Objective-C 中分开调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385410/

相关文章:

objective-c - Launchpad 使用哪个控件?

c++ - 为一副纸牌初始化 std::array<card,52> 时出错

ios - 将核心图像过滤器 (CIBumpDistortion) 仅应用于图像的一部分 + 更改选择半径和 CIFilter 的强度

ios - 不兼容的整数到指针转换 "int"到 "id"的参数类型

ios - 将UitableViewCell分成两种颜色

c++ - 类工厂创建派生类 C++

C#:解决继承类与其基类之间的无效转换异常

ios - 从 UITableViewCell 隐藏 UILabel 不会调整 contentView 的大小

macos - 告诉 macOS 不带 .png 扩展名的自定义文件格式是有效的 png

objective-c - NSEnumerator 性能与 Cocoa 中的 for 循环