Objective-C基础教程学习笔记(十)对象初始化

目前为止,两种创建新对象的两种方法:第一种是[类名 new],第二种是[[类名 alloc] init]。这两种方法是等价的,不过,通常的Cocoa惯例是使用alloc和init,而不使用new。

分配对象

分配(allocation)是一个新对象诞生的过程。从操作系统获得一块内存并将其指定为存放对象的实例变量的位置。向某个类发送alloc消息的结果,就是为该类分配一块足够大的内存,以存放该类的全部实例变量。同时,alloc方法还顺便将这块内存区域全部初始化为0。同于未初始化内存而引起的各种各样的随机bug曾经折磨着许多放言,而alloc方法将分配的内存初始化为0,这样就不用担心此类问题了。所有的BOOL类型变量被初始化为NO,所有的int类型变量被初始化为0,所有的float类型变量被初始化为0.0,所有的指针被初始化为nil。

一个刚刚分配的对象并不能立即使用,需要先初始化该对象,然后才能使用它。有些语言(包括C++和Java),使用构造函数在单次操作中执行对象的分配和初始化。Objective-C将这两种操作拆分为两个明确的步骤:分配和初始化。

 

初始化对象

与分配对应的操作是初始化。初始化(initialization)从操作系统取得一块内存,准备用于存储对象。init方法几乎总是返回它们正在初始化的对象。应该像下面这样嵌套调用alloc和init方法:

Car *car = [[Car alloc] init];

而不是像这样:

Car *car = [Car alloc];[car init];

这种嵌套技术非常重要,因为初始化方法返回的对象可能与分配的对象不同。

 

初始化时做什么

init方法中,你要执行全新的初始化工作,经实例变量赋值并创建你的对象完成任务所需要的其它对象。

 

便利初始化函数

有些对象拥有多个以init开头的方法。重要的是知道,这些init方法实际上没什么特别的,它们都只是遵循命名约定的普通方法。

许多类包含便利初始化函数(convenience initializer),它们是用来完成某些额外工作的初始化方法,可以减少你自己完成这些工作的麻烦。

NSString类中的一些初始化方法示例:

-(id)init;

-(id) initWithFormat:(NSString *) format,...; 

-(id) initWithContentsOfFile:(NSString *) path;

打开指定路径上的文本文件,读取文件内容,并使用文件内容初始化一个字符串。这行代码功能非常强大。在C语言中完成这一工作将需要一大堆代码(必须打开文件,读取数据块,追加到字符串,确保尾部零字节位于适当的位置并关闭文件)。

 

初始化函数规则

不需要为你自己的类创建初始化函数方法。如果不需要设置任何状态,或者只需要alloc方法将内存清零的默认行为,则不需要担心 init。

如果构造了一个初始化函数,则一定要在你自己的指定初始化函数中调用超类初始化函数。

如果初始化函数不止一个,则要选择一个作为指定初始化函数。被选定的方法应该调用盐类的指定初始化函数。要按照指定初始化函数的形式实现所有其它初始化函数。

posted @ 2012-10-15 09:04  TQ.CH  阅读(224)  评论(0编辑  收藏  举报