一.构造方法的调用:
Person *p = [Person new];
New方法内部做了两件事:1.使用alloc方法来分配存储空间(返回分配的对象)。
2.使用init方法来对对象进行初始化。
把new方法进行拆开:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1 = [Person alloc];
2.调用对象方法-init进行初始化,返回对象本身
Person *p2 = [p1 init];
3.两个过程合并为一句:
Person *p = [[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0。
二.例子:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
//这里声明重写init也行,在.m直接重写也行
//-(id)init;
@end
@implemetation Person
//重写
-(id)init{
//初始化对象拥有的父类的成员变量
if(self = [super init]){
_age = 18;//初始化对象自有的成员变量
}
//返回一个已经初始化完成的对象。
return self;
}
@end
int main(){
Person * p = [[Person alloc] init];
NSLog(@"%d",p.age);
return 0;
}
// 打印 18;
构造方法 : 用来初始化对象的方法,是个对象方法,-开头
子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
重写构造方法的目的 : 为了让对象创建出来,成员变量就会有一些固定的值
**重写构造方法的注意点**:
1.先调用父类的构造方法([super init]):
一定要调用回 super 的 init 方法:初始化父类中声明的一些成员变量和其他属性
2.再进行子类内部成员变量的初始化
原则:先初始化父类,再初始化子类.
关于初始化构造方法详解:
例子:
Person *p = [[Person alloc] init];//等价于 Person *p = [Person new]
1.首先调用 alloc 方法,为每个成员变量分配空间:
2.在 Person 的对象中,有_age 变量,默认还有一个变量 isa,调用 alloc 方法后,_age 和 isa 将存在于内存空间中,并且默认情况下他们都有一个初值且初值都为 0。
3.然后对象就会调用父类中的 init 方法,父类之后就会去调用 NSObject 中的 init 方法,于是所有成员变量就被重新赋值,_age = 0 和 isa = [Person class]。即对象的成员变量 isa 将变成一个指向对象父类的指针。而重写 init方法可以给_age 重新赋值,可以让_age 等于除 0 以外的值。
4.所以在重写 init 方法时一定要判断 self = [super init]是否成立,也就是判断是否成功调用了 NSObject 中的 init方法,只有成功调用 init 方法后才可重写构造方法。
二、自定义构造方法
(一)自定义构造方法的规范
(1)一定是对象方法,以减号开头
(2)返回值一般是id类型
(3)方法名一般以initWith开头
自定义构造方法的使用注意
(1)自己做自己的事情
(2)父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性