第十章对象初始化


创建新对象的两种不同方法:
第一种方法:[类名 new]
第二种方法:[[类名 alloc] init]
这两种方法是等价的,不过Cocoa的惯例是使用alloc和init,而不使用new
一、分配对象
alloc
分配allocation是从操作系统获得一块内存并将其指定为存放对象的实例变量的位置
  1. 向某个类发送alloc消息就是为该类分配一块足够大的内存,以存放该类的全部实例变量
  2. alloc方法还顺便将这块内存的全部区域初始化为0,以避免初始化内存问题
二、初始化对象init
初始化initialization从操作系统取得一块内存,准备用于存储对象,init方法总是返回它正在初始化的对象

    应像下面这样嵌套调用alloc和init方法:
Car *car = [[Car alloc] init];
    因为初始化方法返回的对象可能与分配的对象不同,所以嵌套调用是比较理想的
1、编写初始化方法
举例代码:
-(id)init
{
       if(self = [super init]){
engine = [Engine new];
       }
    }
if(self = [super init]){暗示在方法中self对象可能发生改变
首先,执行[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
{
     if(self = [super init]){
         pressure = p;
         treadDepth = td;
     }
     return(self);
}
四、初始化函数
指定初始化函数designated initializer,通常接受参数最多的初始化方法最终成为指定初始化函数

初始化函数规则:
1、如果不需要设置任何状态或者只需要alloc方法将内存清零,则不需要创建初始化函数
2、如果构造了一个初始化函数,则一定要在自己指定的初始化函数中调用超类的指定初始化函数
3、如果初始化函数不止一个,则要选择一个作为指定初始化函数。被选定的方法应该调用超类指定的初始化函数,并实现所有其他初始化函数


看得有点乱吧,我也很晕
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值