//---------------------构造方法 init 创建对象:Person *p=[Person new]; new方法内部做了3件事情: 1. 使用了alloc方法来分配存储空间 2. 使用了init方法对对象进行初始化 // init方法,就叫做构造方法,用来初始化对象的 3. 返回空间首地址
[[Person alloc] init]; 注意 一个刚刚分配的对象并不能立即使用 , 需要先初始化该对象,然后才能使用它 , 如果未进行初始化, 随后可能出现一些不可预测的行为.
//--------------------------重写构造方法
"先强记:" - (instancetype)init { //先初始化父类的实例变量 self = [super init];
if (self) {
// 要初始化的成员变量.
} return self; } ----------------------------------
"再理解:" 1. [super init]的作用:先调用父类的初始化方法,对从父类继承过来的成员变量进行初始化。初始化完了之后,返回我当前的对象指针。
2. 重写构造方法注意事项: 构造方法使用注意 (1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候 应该首先对从父类继承而来的成员变量先进行初始化。 (2)原则:先初始化父类的,再初始化子类的。 (3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。 (4)注意点:先调用父类的构造方法[super init]; 再进行子类内部成员变量的初始化。
"深入理解: "
//练习
结合所学知识:
Person 属性 int _age , NSString *_name
Student 属性: int *_sno
Student 继承于 Person
要求: 1. 让Person一创建就有信息 (_age不为0,_name不为nil) 2. 让Student一创建就有信息 ( _sno不为0 同时继承于父类的信息也不为0 )
super 其实 是子类空间中父类对象的信息
//---------------------构造方法应用场景: 如果对象中的一些属性需要在初始化的时候就需要有值, 可以使用构造方法来完成.
举例: 士兵随时随地都有一把枪,都能开枪
士兵 ---> 只需要负责开枪 士兵new的时候就要给他的_gun赋值
枪 ----> 只负责发射子弹 枪 new 的时候 就要给它的 子弹数赋值
总结: 自己初始化自己的属性
//--------------------------自定义构造方法
思考?
能不能构造方法 是通过参数的传递 使用形参 来初始化对象的属性
1. 自定义构造方法的规范 (1)一定是对象方法,以减号开头 (2)返回值一般是id类型或者instancetype类型 (3)方法名一般以initWith开头 // initwith //错误
- (instancetype)init { self = [super init]; if (self) { // 要初始化的成员变量.
} return self; }
2. 自定义构造方法的实现
举例:
'父类' - (instancetype)initWithName:(NSString *)name andAge:(int)age { self = [super init]; if (self) { // 要初始化的成员变量. _name = name; _age = age; } return self; }
'子类' -(instancetype)initWithName:(NSString *)name andAge:(int)age andSex:(enum Sex)sex{
self = [super initWithName:name andAge:age];
_sex = sex;
return self; }
如果父类 重写了构造方法或者没有重写构造方法 子类中 super 调用init方法
如果父类已经使用了自定义构造方法,子类在重写或者自定义构造方法的时候 super 调用的就是父类的自定义构造方法 3. 自定义构造方法的使用注意 "注意:initWith" // W大写 "自定义的构造方法一定需要声明" (1). 自己做自己的事情 (2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性 4. 使用场景 如果对象被创建的时候, 需要对里面某些属性进行初始化(设置), 这个时候就可以使用构造方法
|