1. new方法实现原理
- 自动调用构造方法,完整的创建一个可用的对象: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...开头