构造方法
注意:
一个刚刚分配的对象并不能立即使用 ,
需要先初始化该对象,然后才能使用它 ,
如果未进行初始化, 随后可能会出现一些不可预测的行为.
默认初始化:
重写构造方法
重写构造方法的目的:
重写构造方法的固定格式:
- (instancetype)init{
}
1. [super init]的作用:先调用父类的初始化方法,对从父类继承过来的成员变量进行初始化。初始化完了之后,返回我当前的对象指针。
2.重写构造方法注意事项:
构造方法使用注意
(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候 应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的,再初始化子类的。
(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(4)注意点:先调用父类的构造方法[super init]; 再进行子类内部成员变量的初始化。
3.构造方法应用场景:
如果对象中的一些属性需要在初始化的时候就需要有值, 可以使用构造方法来完成.
自定义构造方法
1. 自定义构造方法的规范
(1)一定是对象方法,以减号开头
(2)返回值一般是id类型或者instancetype类型
(3)方法名一般以initWith开头
2. 自定义构造方法的实现
- (instancetype)init
{
}
3.自定义构造方法的使用注意
(1). 自己做自己的事情
(2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
自定义构造方法
1. 自定义构造方法的规范
(1)一定是对象方法,以减号开头
(2)返回值一般是id类型或者instancetype类型
(3)方法名一般以initWith开头
2. 自定义构造方法的实现
- (instancetype)initWithName:(NSString *)name andAge:(int)age;
{
}
3.自定义构造方法的使用注意
(1). 自己做自己的事情
(2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性
4.使用场景
如果对象被创建的时候, 需要对里面某些属性进行初始化(设置), 这个时候就可以使用构造方法
5,instancetype和id的作为返回值的区别;
instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;
重写构造方法代码实现:
#pragma mark FaShi.h
#import "Person.h"
// 假设 FaShi
@interface FaShi : Person
@property int blood;
#pragma mark
#import "FaShi.h"
@implementation FaShi
-(instancetype)init{
return self;
}
#pragma mark main.m
#import
#import "Person.h"
#import "FaShi.h"
int main(int argc, const char * argv[]) {
}
#pragma mark
#import
@interface Person : NSObject
//
//
@property int coin;
@property int level;
#pragma mark
#import "Person.h"
@implementation Person
//重写
- (instancetype)init{
//初始化子类自己的东西
返回self ----> alloc 完成的那个对象
}
@end
自定义构造方法的代码实现:
#pragma mark
#import
#import "Person.h"
#import "Student.h"
//Person 类创建成功后,给人起一个名字
//创建一个学生的类
//要求创建学生的时候,指定姓名 年龄 学号
int main(int argc, const char * argv[]) {
//
//
//
//
#pragma mark
#import
@interfacePerson : NSObject
@property NSString* name;
@property int age;
-(instancetype)initWithName:(NSString *)name andAge:(int)age;
@end
#pragma mark
#import "Person.h"
@implementation Person
-(instancetype)initWithName:(NSString *)name andAge:(int)age{
}
@end
#pragma mark
#import "Person.h"
@interfaceStudent : Person
@property int sno;
-(instancetype)initWithName:(NSString *)name andAge:(int)age andSNO:(int)sno;
#pragma mark
#import "Student.h"
@implementation Student
-(instancetype)initWithName:(NSString *)name andAge:(int)age andSNO:(int)sno{
}
@end