gpt4 book ai didi

ios - Objective-C 中的 init 实际上做了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:58 25 4
gpt4 key购买 nike

+ (id)alloc;

- (id)init;

是来自 NSObject.h 的方法

分配确实

+ (id)alloc {
return _objc_rootAlloc(self);
}


id
_objc_rootAlloc(Class cls)
{
#if 0 && __OBJC2__
// Skip over the +allocWithZone: call if the class doesn't override it.
// fixme not - this breaks ObjectAlloc
if (! ((class_t *)cls)->isa->hasCustomAWZ()) {
return class_createInstance(cls, 0);
}
#endif
return [cls allocWithZone: nil];
}

它进行内存分配,并返回一个类实例。

但是到了init方法,就是这个实现

- (id)init {
return _objc_rootInit(self);
}

id
_objc_rootInit(id obj)
{
// In practice, it will be hard to rely on this function.
// Many classes do not properly chain -init calls.
return obj;
}

它只返回自身对象(NSObject),不做任何初始化。

文档也说了同样的话。

“NSObject 类中定义的 init 方法不进行初始化;它只是返回自身。”

如果是这种情况,单独的 alloc 方法就足够了。Init 方法仅在覆盖时需要。

这里有什么解释吗?


这是NSObject.mm的实现源

http://www.opensource.apple.com/source/objc4/objc4-532/runtime/NSObject.mm

最佳答案

alloc 是在 init(或 initX 等,init 系列)时处理内存分配是在创建对象时根据需要配置分配的内存 - 任何特定的类,现在或将来经过一些修改,是否需要在 init 中做任何工作取决于语义那个类(class)。但是,由于您不知道任何任意类是否 init 需要做任何工作,您必须调用它,并且由于任何任意类都不知道其父类(super class)是否需要进行任何初始化才能调用它的父类(super class) init 在它自己的 init 中。要让这个链工作 NSObject 必须有一个 init,碰巧它(目前,谁知道将来)不起作用。 NSObjectinit 是链的末端,也是唯一不需要调用另一个 init 的。

由于许多语言将分配和初始化这两个操作合并为一个不可分割的操作,因此有些人会感到困惑,例如Java 中的 new。事实上,Cocoa 也有一个 new 定义为 alloc 后跟 init

Apple 真的应该这样写:

The init method defined in the NSObject class currently does no initialization; it simply returns self.

或者干脆什么都不说。

HTH

关于ios - Objective-C 中的 init 实际上做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com