一:id类型
1> id 是一种类型,万能指针,能够指向\操作任何的对象。
typedef struct objc_object *id;
注意点:在使用id定义的时候,一定要注意(*)id类型默认已经包含了*所以不需要在加*;
局限性:调用一个不存在的方法,编译器会马上报错。
2>instancetype类型
(1)instancetype会让编译器检查实例化对象的准确类型
(2)instancetype只能用于返回类型,不能当做参数使用
3>.instancetype & id的比较
(1) instancetype在类型表示上,跟id一样,可以表示任何对象类型
(2) instancetype只能用在返回值类型上,不能像id一样用在参数类型上
(3) instancetype比id多一个好处:编译器会检测instancetype的真实类型
二:构造方法
1> 完整的创建一个可用的对象:Person *p=[Person new];
New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始化。
Person *p = [Person new];
// 1 分配空间 2 初始化 3返回地址
Person *p1 = [[Person alloc] init]
//先分配空间
Person *p3 = [Person alloc];
// p3->name;
p3 = [p3 init]; //
在初始化 init 默认的构造方法,构造方法会把类是成员变量都是初始化为0
也就是所构造方法就是初始化的方法,默认如果我们不重写构造方法的话,默认会调用父类的初始化方法。
为什么要重写构造方法内,当我们需要创建对象就需要对象的成员属性有值。
2>重写构造方法的步骤
//总共分三步:
//1、初始化当前类的实例变量之前,先要初始化父类的
//2、初始化当前类的实例变量
//3、返回
//重写父类的init方法
- (id)init{
if (self = [super init]) {
//初始化当前类的实例变量
_age = 18;
_weight = 50.0f;
}
return self;
}
注意:一定要初始化父类的构造方法,因为父类中得成员变量也需要初始化,比如isa指针。
3>注意点
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:#1先调用父类的构造方法[super init]; #2再进行子类内部成员变量的初始化。
三:自定义构造方法
实际应用中我们大多采用这种 (自定义构造方法)
1>规范:
1)一定是对象方法,以减号开头
(2)返回值一般是id类型
(3)方法名一般以initWith开头
-(id)initWithName:(NSString *)name andAge:(int)age{
//先做父类的事情
if (self = [super init]) {
//用形参初始化实例变量
_name = name;
_age = age;
}
return self;
}
2>注意:
父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
3>重写 和 构造方法
重写:指的是将父类的方法重写实现 (子类不需要在声明,其实是内部默认
已经声明)
构造方法:用来初始化对象 (类似与init)但是子类对象的初始化要先对父
类的对象进行初始化操纵