Chapter 5 : 对象(object/instance)初始化
1. 示例代码:
1 // Tire.h文件 2 #import <Cocoa/Cocoa.h> 3 4 @interface Tire : NSObject 5 { 6 float pressure; 7 float treadDepth; 8 } 9 10 - (id)initWithPressure:(float)pressure; 11 - (id)initWithTreadDepth:(float)treadDepth; 12 // 指定初始化函数 13 - (id)initWithPressure:(float)pressure treadDepth:(float)treadDepth; 14 15 - (void)setPressure:(float)pressure; 16 - (float)pressure; 17 18 - (void)setTreadDepth:(float)treadDepth; 19 - (float)treadDepth; 20 21 @end
1 // Tire.m文件 2 3 #import "Tire.h" 4 5 @implementation Tire 6 7 - (id)init 8 { 9 if (self = [self initWithPressure:34 treadDepth:20]) 10 { 11 // Do some thing 12 } 13 14 return self; 15 } 16 17 - (id)initWithPressure:(float)p 18 { 19 if (self = [self initWithPressure:p treadDepth:20]) 20 { 21 } 22 23 return self; 24 } 25 26 - (id)initWithTreadDepth:(float)td 27 { 28 if (self = [self initWithPressure:34.0 treadDepth:td]) 29 { 30 } 31 32 return self; 33 } 34 35 - (id)initWithPressure:(float)p treadDepth:(float)td 36 { 37 if (self = [super init]) 38 { 39 pressure = p; 40 treadDepth = td; 41 } 42 43 return self; 44 } 45 46 - (void)setPressure:(float)p 47 { 48 pressure = p; 49 } 50 51 - (flaot)pressure 52 { 53 return pressure; 54 } 55 56 - (void)setTreadDepth:(float)td 57 { 58 treadDepth = td; 59 } 60 61 - (float)treadDepth 62 { 63 return treadDepth; 64 } 65 66 - (NSString *)description 67 { 68 NSString *desc = [NSString stringWithFormat:@"Tire: Pressure: %.1f TreadDepth:%.1f", pressure, treadDepth]; 69 70 return desc; 71 } 72 73 @end
2. 对象初始化:看完上面的示例代码后会发现,对象初始化方法的通常写法如下:
1 - (id)init 2 { 3 if (self = [super init]) 4 { 5 ... 6 } 7 8 return self; 9 }
PS : 在自定义的初始化方法中,需要调用自定指定的初始化函数或者超类指定的初始化函数。
一定要将超类的初始化函数的值赋给self对象,并返回你自己的初始化方法方法的值。
超类的初始化可能决定返回一个完全不同的对象。
3. 关于初始化方法的命名一般由init开头, 比如:
1 // NSString类中的一些初始化方法: 2 3 // 返加一个空的字符串 4 NSString *emptyString = [[NSString alloc] init]; 5 6 // 返回一个字符串值 7 NSString *string = [[NSString alloc] initWithFormat:@"%d or %d", 25, 624]; 8 9 // 返回指定路径上的文件中的内容 10 NSString *string = [[NSString alloc] initWithContentOfFile:@"/tmp/words.txt"];
4. 初始化方法规则:
-> 若不需要为自己的类创建初始化方法,则可使用默认的方法,即:[[instance alloc] init];
-> 若要构造一个初始化方法,则一定要在自己的初始化方法中调用超类指定的初始化方法。
-> 若初始化方法不止一个,则需要选定一个指定的初始化方法,被选定的方法应该调用超类指定的初始化方法。