self = [super init]

初始化方法的标准结构是这样子的:

- (instancetype)init
{
    self = [super init]; // call the designated initializer
    if (self) {
        // Custom initialization
    }
    return self;
}

我们主要来看看,这一句:

    self = [super init]; // call the designated initializer

问题1:[super init] 到底做了什么?

问题2:为什么把[super init]的值赋值给self?

问题3:我们用过了 alloc init的两部创建,为什么不是[[super alloc] init]

先来回答问题3,因为这个问题是来搞笑的:

我们看下alloc方法是怎么定义的 
+ (instancetype)alloc;
可以看到alloc是一个类方法,而super不是一个类.

然后我们在来看看问题1:

[super init] 的结果可能有三种:
第一种:  [super init] 初始化成功,这个是最最正常的情况。
第二种:    [super init] 初始化失败,我们都知道oc的两步创建,alloc开辟内存空间,init初始化对象,但是init还有另外一个作用,在初始化失败的时候,init方法会返回一个nil。回头行文的最上面,如果self为nil,那么if(self)语句的内容,将不被执行,已确保程序健壮安全。
- (instancetype)init
{
    self = [super init]; // call the designated initializer
    if (self) {
        // Custom initialization
    }
    return self;
}
第三种:self = [super init]执行之后,内存指向了不相关的地址。这种情况的出现,一般是一下几种情况:单例、类簇、对象为NSNumber类型、父类在初始化的时候释放了当前对象,然后重新开辟了新的内存地址。

最后,我们来使用《禅与 Objective-C 编程艺术》的原话来回答问题2:

如果你的超类没有成功初始化它自己,你必须假设你在一个矛盾的状态,并且在你的实现中不要处理你自己的初始化逻辑,同时返回 nil。如果你不是这样做,你看你会得到一个不能用的对象,并且它的行为是不可预测的,最终可能会导致你的 app 发生 crash。

一句话概括:

if( self = [super init] )这是一种通常的建议写法,赋值并测试nil只是为了防止超类在初始化过程中发生改变,返回了不同的对象。

参考:

《禅与 Objective-C 编程艺术》中文版
中文版地址:https://github.com/oa414/objc-zen-book-cn#class-cluster
转载地址:http://www.jianshu.com/p/4c9112f8625d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值