self = [super init]

Objective-C的推荐init方法写法如下:
- (id) init
{
    if(self = [super init])
    {
        //为子类增加属性进行初始化
    }
    return self;
}
 
返回值为id类型,id类型可以赋值给其他类型指针,其他类型指针也可以赋值给id类型
obc中子类指针不能直接赋值给父类指针
[super init]也是返回self,再不改变self所指向对象的情况下,这个self跟子类的self是一样的,因为转化为消息调用时传入的Receiver都一样
如果在父类中改变了self所指向的对象,可能出现意想不到的bug:
- (id) init
{
    id tmp = self;
    self = [AObj alloc];
    [tmp release];
    //other staffs
    return self;
}

BObj的init方法如下:

- (id) init
{
    if(self = [super init])
    {
        //other staffs
    }
    return self;
}

这时编译能通过,但当BObj的实例使用到BObj扩充的属性时,就会出现一个运行时错误。错误的原因在于AObj的init方法用[AObj alloc]重新获得了一块仅仅适合存放AObj实例的空间。而BObj的init方法以为这是块适合存放BObj的空间。当试图读写BObj的扩充属性时便会产生运行时错误。

因此,当init方法需要重新alloc一块空间时,正确的写法如下:

- (id) init
{
    id tmp = self;
                    
    self = [[self class] alloc];
                    
    [tmp release];
    //other staffs
    return self;
}

注意第5行,[self class]将获得self指向的实例对应的类实例,本例中便是BObj。这样AObj的任何子类的init方法都能保证安全了

同样,在单例模式下,父类返回自己的对象(或把自己alloc出来的对象赋给self再返回),也会出现类似的bug,所以单例最好不要派生子类

 

http://blog.csdn.net/lamp_zy/article/details/8247563

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值