OC中init方法的重写和自定义
一、init方法介绍
OC中的init方法的作用是在对象实例化后对其初始化,在其它编程语言中(如Java、C++)都有构造方法,OC中init方法和构造方法是一个概念的。
假设有如下的类声明和实现:
#import@interface Student : NSObject @property NSString *name; @property int age; @property float score; -(void)show; @end @implementation Student -(void)show { NSLog(@"I am a Student,My name is %@ ,%d years old",_name,_age); } @end
调用Student类的类方法new
Student *s1=[Student new];
其等价于
Student *s2=[[Student alloc] init];
其中alloc方法用于实现化一个对象,init用来将对象初始化。
默认的初始化规则是:
基本数据类型初始化为0
指针数据类型初始化为空
如果我们不想使用默认的初始化规则,则可以重写init方法或自定义init方法。
二、重写init方法
重写init方法必须符合如下规范:
- (instancetype)init { self = [super init]; //用于初始化父类 if (self) { // do something } return self; }
下面我们将重写Student类的init方法
- (instancetype)init { self = [super init]; //用于初始化父类 if (self) { self.name=@"小明"; self.age=18; } return self; }
在main函数中使用使用new类方法实例化一个对象
Student *s1=[Student new]; [s1 show];
运行结果:
I am a Student,My name is 小明 ,18 years old
Program ended with exit code: 0
三、自定义的init方法
自定义的init方法常用于在初始化对象时指定对象的值,同样的,自定义的init方法也需要遵守一定的语法规范:
- (instancetype)initWithName:(NSString *)name andAge:(int)age { self = [super init]; if (self) { // statements } return self; }
自定义的init方法需要在@inferface中声明而且其中方法名必需符合initWithXXX: … andXXX:…
否则编译编译器不会把它当做init方法,导致错误。
在main函数中使用使用自定义init方法实例化一个对象
Student *s2=[[Student alloc ]initWithName:@"小华" andAge:21]; [s2 show];
运行结果:
I am a Student,My name is 小华 ,21 years old
Program ended with exit code: 0