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