一、init方法介绍
OC中的init方法的作用是在对象实例化后对其初始化,在其它编程语言中(如Java、C++)都有构造方法,OC中init方法和构造方法是一个概念的。
假设有如下的类声明和实现:
#import <Foundation/Foundation.h>
@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