OC语言 - 构造方法

■ 前言

OC 中 init 开头的方法我们称之为构造方法,也叫初始化方法。比如 Person *p = [Person new] 这里的 new 方法分两步实现

1. 先使用 alloc 方法来分配存储空间

2. 使用 init 方法来对对象进行初始化,目的就是让某个实例对象一创建出来就拥有某些属性和值

注:构造方法的返回值是 id/instancetype 型,一般建议使用 instancetype;一个类中可以有多个初始化方法,但默认初始化方法只有一个 

代码示例:使用构造方法

1. 让每一个 Person 实例对象创建出来的初始值是 10,而不是默认的 0

// - Person.h

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end

// - Person.m

#import "Person.h"
@implementation Person
-(id)init{
    // 首先要初始化父类成员变量
    if (self = [super init]) {
        // 然后初始化对象自身的成员变量
        _age = 10;
    }
    // 返回初始化对象
    return self;
}

@end

// - main.m

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p = [Person new];
        NSLog(@"%d",p.age);
    }
    return 0;
}

2. 要求 Student 实例对象初始化之后,年龄是 10,学号是 1

// - Student.h

#import "Person.h"
@interface Student : Person
@property int Num;
@end

// - Student.m

#import "Student.h"
@implementation Student
-(id)init{
    // 调用父类的初始化方法,会把年龄初始化成 10
    if (self = [super init]) {
        _Num = 1;
    }
    return self;
}
@end

// - main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *s = [Student new];
        NSLog(@"%d,%d",s.age,s.Num);
    }
    return 0;
}

■ 自定义构造方法

声明规范如下

1. 一定是对象方法,且以 - 号开头

2. 返回值一般是 id/instancetype 型

3. 方法名以 initWith 开头

代码示例:

// - Person.h

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property NSString *name;
@property int num;
-(id)initWithName:(NSString*)name;
-(id)initWithName:(NSString*)name andNum:(in)no;
@end

// - Person.m

#import "Person.h"
@implementation Person
-(id)initWithName:(NSString*)name{
    if (self = [super init]) {
        _name = name;
    }
    return self;
}
-(id)initWithName:(NSString*)name andNum:(int)no{

    if (self = [super init]) {
        _name = name;
        _num = no;
    }
    return self;
}
@end

// - Student.h

#import "Person.h"
@interface Student : Person
@property int age;
-(id)initWithName:(NSString*)name andNum:(int)no andAge:(int)age;
@end

// - Student.m

#import "Student.h"
@implementation Student
-(id)initWithName:(NSString*)name andNum:(int)no andAge:(int)age{
    if (self = [super init]) {
        _age = age;
    }
    return self;
}
@end

 

posted on 2018-08-07 10:03  低头捡石頭  阅读(92)  评论(0编辑  收藏  举报

导航