美文网首页
OC 构造方法

OC 构造方法

作者: 李琪_59dc | 来源:发表于2017-09-19 23:10 被阅读0次

    1. new方法实现原理

    1. 自动调用构造方法,完整的创建一个可用的对象:Person *p=[Person new];

    可以把new方法拆开如下:
    (1) 调用类方法+alloc分配存储空间,返回未经初始化的对象
    Person* p1=[Person alloc];
    (2) 调用对象方法-init进行初始化(指针类型变为空,基本类型变成0),返回对象本身
    Person *p2=[p1 init];
    (3) 以上两个过程整合为一句:Person *p=[[Person alloc] init];
    [Person new]等价于[[Person alloc]init]

    • init方法是系统自带的,实现在NSObject类里,如果在类中重写
      -(instancetype)init,new的时候也会自动调用重写的init方法
    • 可通过重写init方法加载一些固定的必要的资源。

    2. 构造方法

    • 目的:初始化一个对象时自动调用的方法,让一个对象一创建出来就拥有某些属性和值。

    以init开头的构造方法都必须先用父类初始化:if ( self=[super init] );

    -(instancetype)init{
        /*self 是一个指针,表示当前调用该方法的对象本身*/
        /*super是一个关键字,用来调用父类方法*/
        self=[super init];   //最基本的初始化操作
        if(self){
           //要初始化的内容
        }
        return self;  //判断父类初始化成功后,返回当前对象的地址 return self;
    }
    
    • instancetype解析:
      • init无法确认是什么类继承了NSObject
      • instancetype前身是id,可以指向任意的对象类型;
      • id的弊端:虽然可表示所有类型,但是一个公共类型,处理不了精准的问题。
      • instancetype更加智能,init写在哪个类中,就会自动用该类名来替代instancetype,instancetype只能用在构造方法里的返回类型

    例子:

    @interface Person:NSObject{
        NSString* _name;
    }
    //为一个对象进行初始化的方法
    -(instancetype)initWithName:(NSString*)name;   //显示声明
    @end
    
    @implementation Number
    -(instancetype)initWithName:(NSString*)name{
        self=[super init];   //先调用父类构造方法
        if(self){                  //自定义的构造方法,进行子类内部成员变量的初始化
            _name=name;
        }
    }
    @end
    
    • 有成员变量的类需要写构造方法
    • 自定义的构造方法需要显示声明
    • 自定义构造方法一定是对象方法,-开头
    • 返回值一般是instancetype类型
    • 带参数的构造方法名必须以initWith...开头

    相关文章

      网友评论

          本文标题:OC 构造方法

          本文链接:https://www.haomeiwen.com/subject/fhzgsxtx.html