zoukankan      html  css  js  c++  java
  • 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,所以单例最好不要派生子类

  • 相关阅读:
    2015.4.16-C#中ref和out的区别
    2015.4.10-SQL 高级查询(二)
    2015.4.10-C#入门基础(三)
    2015.4.8-C#入门基础(二)
    2015.4.7-C#入门基础(一)
    2015.4.2-SQL 简单语句(一)
    对GridView的某一列行进行操作。。
    jquery获取GridView中RadioButton选中的数据
    Ajax获取前台的数据
    前台验证
  • 原文地址:https://www.cnblogs.com/geek6/p/3906098.html
Copyright © 2011-2022 走看看