init实际上做了什么?

时间:2014-06-01 20:18:59

标签: ios objective-c xcode

+ (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];
}

它执行内存分配,并返回一个类Instance。

但是当我来到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

2 个答案:

答案 0 :(得分:5)

alloc与内存分配有关,而init(或initX等,init系列)与在需要时配置分配的内存有关。创建对象 - 现在或将来某些修订后的任何特定类是否需要在init中执行任何工作,这取决于该类的语义。但是,由于您不知道任何类是否init需要做任何工作,您必须调用它,并且任何类都不知道它的超类是否需要进行任何初始化必须在自己的init内调用其超类init。要使这个链工作NSObject必须有一个init,它就会发生它(目前,谁知道将来)不起作用。 NSObject' init是链的末尾,也是唯一一个不需要调用另一个init的人。

一些语言将这两种操作(分配和初始化)组合成一个不可分割的操作,例如: Java中的new。事实上,Cocoa也有new,其定义为alloc,后跟init

苹果应该真的写了:

  

NSObject类当前中定义的init方法没有初始化;它只是回归自我。

或者什么也没说。

HTH

答案 1 :(得分:0)

CRD很好地解释了这一点。

然而,我会更强烈地说明。

在Objective C中创建新对象的方法是使用alloc / init。

您应始终初始化每个对象,并且自定义init方法应始终调用[super init]。考虑无法在所有对象上调用init错误,并且还考虑在自定义初始化方法中调用[super init]时出错。