OC 构造方法

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...开头
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容