在OC中有关对象初始化的方法很多,下面有几点:
创建新对象的两种不同的方法是:[类名 new]和[[类名 alloc] init],
并且这两种方法是等价的。
主要分为两步:
1、分配(allocation)
在创建新对象的过程中需要分配内存,向某个类发送alloc消息的结果,就是为该类分配一块足够大的内存,以存放该类的实例变量,同时,alloc方法还顺便将这块内存区域全部初始化为0.
例如,BOOL类型变量被初始化为NO,int类型变量被初始化为0,指针被初始化为nil。
一个刚刚分配的对象并不能立即使用,需要先初始化该对象,然后才能使用它。
2、初始化(initialization)
初始化从操作系统取得一块内存,准备用于存储对象。
init方法几乎总是返回它们正在初始化的对象。
因为初始化方法返回的对象可能与分配的对象不同,
所以嵌套调用alloc和init方法应该如下
Car *car=[[Car alloc] init];
而不是如:Car *car = [Car alloc];[car init];
下面就以Car为父类,Tire和Engine为子类进行分析
-(id)init
{
if(self = [super init])
{
engine = [Engine init];
tire[0] = [Tire new];
tire[1] = [Tire new];
tire[2] = [Tire new];
tire[3] = [Tire new];
}
return self;
}
上述代码中,if(self = [super init])表明self对象可能发生改变,
[super init]的作用是使超类完成它们自己的初始化工作,如果返回的对象发生改变, 则self需要更改。
最后,init方法返回已经被初始化的对象。
3、便利初始化函数
最常见的有
-(id)init;
这一基本方法在NSString类中初始化一个新的空字符串。
而NSString *emptyString = [[NSString alloc] init]
在NSMutableString中返回一个空字符串。
-(id)initWithFormat: (NSString *)format,…;
初始化一个新的字符串作为格式化操作的结果,
例如:string=[[NSString alloc] initWithFormat: @"%d or %d",10,23];
-(id)initWithContentsofFile: (NSString *)path;
initWithContentsofFile:方法打开指定路径上的文本文件,
读取文件内容,并使用文件内容初始化一个字符串。
4、指定初始化函数
在Tire类中增加两个便利初始化函数:
@interface Tire: NSObject
{
float pressure;
float treadDepth;
}
-(id) initWithPressure: (float)pressure;
-(id) initWithTreadDepth:(float)treadDepth;
-(id) initWithPressure:(float)pressure
treadDepth:(float)treadDepth;
-(void)setPressure:(float)pressure;
-(float)pressure;
-(void)setTreadDepth:(float)treadDepth;
-(float)treadDepth;
@end
上述两个新的初始化函数initWithPressure:和initWithTreadDepth:,
它们需要具有特定的轮胎压力或花纹深度的tire对象而不关心其他属性值,并且乐意接受默认值。
把父类的实例变量初始化的方法称为指定初始化方法。
通常,接受参数最多的初始化方法最终成为指定初始化函数。
不需要为自己的类创建初始化函数方法,如果构造了一个初始化函数,则一定要在自己的指定初始化函数中调用父类的指定初始化函数。
如果初始化函数不止一个,则要选择一个作为指定初始化函数,被选定的方法应该调用父类的指定初始化函数。