为何要执行 [super init]

static instancetype _I_Test_init(Test * self, SEL _cmd) {
    self = ((Test *(*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){
    (id)self, (id)class_getSuperclass(objc_getClass("Test"))
    }, 
    sel_registerName("init"));
    if (self) {

    }
    return self;
}

objc_msgSendSuper({self, class_getSuperclass(objc_getClass("Test"))}, sel_registerName("init"));

OBJC_EXPORT void objc_msgSendSuper(void /* struct objc_super *super, SEL op, ... */ ) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0); ```

Sends a message with a simple return value to the superclass of an instance of a class.
将具有返回值的消息发送到一个实例的超类.


第一个参数是 objc_suoer 类型的结构体, 第二个或更多是 SEL 方法选择器, 而在 runtime.m 文档中, objc_super 的结构为:

struct objc_super {
    __unsafe_unretained id receiver;
    __unsafe_unretained Class super_class;
};
receiver 是实例对象, super_class 是用来接收消息的类, 为实例对象的父类.

在当前的代码里, receiver 为 self , super_class 为 NSObject .

再回过头来, 注意看 [super init] 的 c++ 源码, 返回值为 Test *, 所以在这里的 init 只是向上初始化父类而已.

那么这就明了了, [super init] 只是为了将父类, 父类的父类, 父类的父类的父类等等等等, 从 NSObject 开始的所有类都初始化了一遍, 只是为了确保父类的方法, 属性都能正确使用而已.

self = [super init]
既然明白了 [super init] 做了什么, 那么返回结果再赋值给 self 就基本没有疑问了: 如果在 [super init] 这一步因为一些不明的原因导致初始化失败, 那么返回值应该是为 nil 的, 这时候让 self 接收一下, 之后用 if 判断, 则可以避免一些 BUG.

总结

为何要执行 [super init] ?
为了将当前实例的父类树进行初始化, 以保证继承父类树的所有属性与方法.
[super init] 的结果为何要 self 接收?
为了确保初始化不会因为失败而 crash.

如果self为基类,super就为空

你可能感兴趣的:(ios,objective-c)