init实际上做了什么?

Edw*_*ony 3 xcode objective-c ios

+ (id)alloc;
Run Code Online (Sandbox Code Playgroud)

和

- (id)init;
Run Code Online (Sandbox Code Playgroud)

是来自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];
}
Run Code Online (Sandbox Code Playgroud)

它执行内存分配,并返回一个类实例.

但是当我来到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;
}
Run Code Online (Sandbox Code Playgroud)

它只返回自身对象(NSObject)而不进行任何初始化.

文档也说同样的事情.

"NSObject类中定义的init方法不进行初始化;它只返回self."

如果是这种情况,仅使用alloc方法就足够了.只有覆盖才需要Init方法.

这里有解释吗?


这是实现源NSObject.mm

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

CRD*_*CRD 5

alloc是否与内存分配有关init(或者initX等等,init系列)与在创建对象时根据需要配置分配的内存有关 - 现在或将来某些修订后的任何特定类是否需要执行任何工作in init依赖于该类的语义.但是,由于您不知道任何类是否init需要执行任何工作,您必须调用它,并且任何任意类都不知道它的超类是否需要进行任何初始化以必须init在其自己内部调用其超类init.对于这个工作链NSObject必须有一个init,它恰好它(目前,谁知道在将来)没有工作.NSObject这init是链条的终结,也是唯一一个不需要调用另一个链条的链条init.

一些语言将两种操作(分配和初始化)组合成一个不可分割的操作(例如newJava),因此出现了混淆.事实上,Cocoa有一个new定义如下alloc的init.

苹果应该真的写了:

NSObject类中定义的init方法当前不进行初始化; 它只是回归自我.

或者干脆什么也没说.

HTH