七:构造方法与自定义构造方法
一、构造方法
1、在OC中构造方法是init开头的方法, 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值。
构造方法属于对象方法,以“-”开头
例如:在创建对象的时候就调用了init方法。
Person *p = [[Person alloc] init];
可以分解为
Person *p1 = [Person alloc]; //分配空间
Person *p = [p1 init]; //初始化对象,即调用init方法
2、书写格式:
1 - (instancetype)init 2 { 3 self = [super init]; 4 if(self != nil){ 5 //初始化子类属性 6 } 7 return self; 8 }
3、注:(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
(2)原则:必须先初始化父类, 再初始化子类
(3)必须判断父类是否初始化成功, 只有父类初始化成功才能继续初始化子类
(4)由于类的声明中不允许属性进行初始化,使用构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。
(5)上面可以合成一句 if(self = [super init]){//初始化子类属性}
二、自定义构造方法
规范:(1)一定是对象方法,以减号开头
(2)返回值一般是instancetype类型
(3)方法名一般以initWith开头
代码实现:
NBA.h
1 #import <Foundation/Foundation.h> 2 3 @interface NBA : NSObject 4 @property int number; 5 @property NSString *name; 6 7 - (instancetype)initWithName:(NSString *)name; 8 - (instancetype)initWithName:(NSString *)name andNumber:(int) number; 9 10 @end
NBA.m
1 #import "NBA.h" 2 3 @implementation NBA 4 5 //自定义构造方法的实现 6 - (instancetype)initWithName:(NSString *)name 7 { 8 // 初始化父类 9 if (self = [super init]) { 10 // 初始化属性 11 _name = name; 12 } 13 // 返回对象 14 return self; 15 } 16 - (instancetype)initWithName:(NSString *)name andNumber:(int) number 17 { 18 if (self = [super init]) { 19 _name = name; 20 _number = number; 21 } 22 return self; 23 } 24 @end
Rookie.h
1 #import "NBA.h" 2 @interface Rookie : NBA 3 //菜鸟的年龄 4 @property int age; 5 //自定义三个参数的构造方法 6 - (instancetype)initWithName:(NSString *)name andNumber:(int)number andAge:(int)age; 7 @end
Rookie.m
1 #import "Rookie.h" 2 @implementation Rookie 3 - (instancetype)initWithName:(NSString *)name andNumber:(int)number andAge:(int)age 4 { 5 //调用父类的构造方法,让父类自己初始化自己的属性 6 if (self = [super initWithName:name andNumber:number]) { 7 //初始化自身独有的属性 8 _age = age; 9 } 10 //返回对象 11 return self; 12 } 13 @end
main.m
1 #import <Foundation/Foundation.h> 2 #import "NBA.h" 3 #import "Rookie.h" 4 int main(int argc, const char * argv[]) { 5 @autoreleasepool { 6 //一个参数的初始化赋值 7 NBA *p = [[NBA alloc] initWithName:@"Kobe"]; 8 NSLog(@"name:%@",p.name); 9 //两个参数的初始化赋值 10 NBA *p1 = [[NBA alloc] initWithName:@"James" andNumber:23]; 11 NSLog(@"name:%@ number:%d",p1.name,p1.number); 12 //三个参数的子类的初始化赋值 13 Rookie *r = [[Rookie alloc] initWithName:@"Towns" andNumber:32 andAge:21]; 14 NSLog(@"name:%@ number:%d age:%d",r.name,r.number,r.age); 15 } 16 return 0; 17 }
结果:
2016-04-25 12:45:19.284 NBA[739:107091] name:Kobe 2016-04-25 12:45:19.285 NBA[739:107091] name:James number:23 2016-04-25 12:45:19.285 NBA[739:107091] name:Towns number:32 age:21 Program ended with exit code: 0
注:自己做自己的事情!即父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性