您的位置:首页 > 移动开发 > Objective-C

Object-C 对象初始化

2015-09-25 09:42 459 查看
对象的初始化: Object-C 创建对象分为两个步骤:分配内存、初始化

例:Fraction *frac=[[Fraction alloc] init];

(1.) alloc 是从 NSObject 继承而来的类方法,用于给对象分配存储空间,所有的成员变量在此时对确定了自己的内存位置,并被赋初值,整数类型为 0,浮点数为 0.0,BOOL 为 NO,对象类型为 nil,alloc 方法返回对象的指针。

(2.) init是从NSObject继承而来的成员方法,这个方法是你在对象创建过程可以参与的方法,因此你可以定制自己的 init 方法。Object-C 对 init 方法没有特殊的要求,就是一个普通方法而已,只不过习惯以init 作为方法前缀。一般 init 方法都返回当前类型的指针或者 id 类型。id 类型在 Object-C 中是一个泛型对象,与前面所说的 Class 对象一样,不使用指针作为变量,id
可以表示任意类型的 Object-C 对象。

中括号可以认为是如何调用你刚才写的这个方法,通常在Objective-C里说“消息”。

比如C#里你可以这么写:

this.hello(true);

在Objective-C里,就要写成:

[self hello:YES];

初始化

预备知识

对象创建
消息

相关文章

多初始化方法
对象复制
内存管理

初始化是对象创建过程中将新分配对象的状态设置为合理的初始值、使之处于可用状态的阶段。我们应该在内存分配动作完成之后才进行初始化。初始化需通过初始化方法(或者简称初始方法)完成,而只有刚分配的对象才能调用初始化方法。除了初始化任务,初始化方法还能执行其他设置任务,以便让对象进入可用状态。例如您可以在该方法中加载资源或者分配堆内存。

初始方法的声明形式

通过约定,我们要求初始方法以 init开头,并且在成功完成初始化动作的时候,返回一个动态类型对象(id),否则返回nil。初始方法可以包含一个或多个参数用于指定初始值。

下面给出NSString初始方法声明作为例子:

- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding

实现一个初始化方法

通常情况下,类会实现一个初始方法,以便对象调用,但这不是硬性要求。如果一个类未实现初始化方法,Cocoa会调用其最近父类的初始化方法。不过,子类通常会定义自己的初始化方法或者重载超类的初始化方法,以此来定制初始化过程。如果一个类实现了初始化方法,则初始化过程第一步应调用超类初始化方法。这么做是为确保初始化动作从根对象开始,并且顺着继承链向下进行。NSObject类将init 方法声明为缺省的对象初始化函数,因而该方法总是最后被调用最先返回。

实现初始化方法的基本步骤如下:

调用超类的初始化方法并检查其返回值。 (请使用保留字super指定超类。) 如果返回值不是nil,即超类的初始化方法返回一个合法的对象,则初始化动作可以继续进行。

为对象的实例变量赋值。在负责管理内存的代码中,如果实例变量自身也是对象,则赋值操作应视情况选择恰当方式,或者复制对象或者保持对象。

返回已完成初始化的对象 ,如果初始化失败则返回nil。

下面给出简单初始化方法,它按照上面的步骤将实例变量date初始化为当前日期:

- (id)init {

if (self = [super init]) { // equivalent to "self does not equal nil"

date = [[NSDate date] retain];

}

return self;

}

在上面代码中,如超类返回nil,则该方法将略过初始化动作并直接将nil值返回给调用者。

一个类可能有多个初始化方法。例如初始化数据采用不同的形式,又或者某个初始化方法提供缺省值(出于便捷性的考虑),都会出现这种情况。在多个初始化方法中,有一个被称为指定初始化方法,它需取得完整地初始化参数才可执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: