创建新对象的两种不同方法:
第一种方法:[类名 new]
第二种方法:[[类名 alloc] init]
这两种方法是等价的,不过Cocoa的惯例是使用alloc和init,而不使用new一、分配对象alloc
分配allocation是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置
- 向某个类发送alloc消息就是为该类分配一块足够大的内存,以存放该类的全部实例变量
- alloc方法还顺便将这块内存的全部区域初始化为0,以避免初始化内存问题
初始化initialization从操作系统取得一块内存,准备用于存储对象,init方法总是返回它正在初始化的对象
Car *car = [[Car alloc] init];
1、编写初始化方法
举例代码:
-(id)init
{
if(self = [super init]){
}
}
if(self = [super init]){暗示在方法中self对象可能发生改变
engine = [Engine new];
首先,执行[super init]其作用是使超类完成他们自己的初始化工作,一般都是NSObject类
然后,init方法可能返回完全不同的对象,如果返回不同的对象则需要更新self,即执行if中的代码
self = [super init]可以捕捉到返回的nil值所以推荐使用这种形式
2、初始化时做什么
init方法给实例变量赋值并创建对象完成任务所需的其他对象
惰性求值lazy evaluation,即在初始化时不提供对自定义对象属性的调用,等到调用者需要时在创建对象
三、便利初始化函数convenience initializer
便利初始化函数是用来完成某些额外工作的初始化方法,以init开头的方法
以NSString类为例
-(id)init;//普通初始化函数
-(id)initWithFormat:(NSString *)format;//便利初始化函数
-(id)initWithContentsOfFile:(NSString *)path;//便利初始化函数
构造自己的便利初始化函数
-(id)initWithPressure:(float)p treadDepth:(float)td
{
}
四、初始化函数
指定初始化函数designated initializer,通常接受参数最多的初始化方法最终成为指定初始化函数
初始化函数规则:
1、如果不需要设置任何状态或者只需要alloc方法将内存清零,则不需要创建初始化函数
2、如果构造了一个初始化函数,则一定要在自己指定的初始化函数中调用超类的指定初始化函数
3、如果初始化函数不止一个,则要选择一个作为指定初始化函数。被选定的方法应该调用超类指定的初始化函数,并实现所有其他初始化函数
看得有点乱吧,我也很晕