OC中init方法的重写和自定义

1、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类的类方法newspa

Student *s1=[Student new];

其等价于指针

Student *s2=[[Student alloc] init];

其中alloc方法用于实现化一个对象,init用来将对象初始化。code

默认的初始化规则是:对象

基本数据类型初始化为0编译器

指针数据类型初始化为空it

若是咱们不想使用默认的初始化规则,则能够重写init方法或自定义init方法。io


2、重写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


    3、自定义的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