Object-C 对象初始化

对象的初始化: 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 方法声明为缺省的对象初始化函数,因而该方法总是最后被调用最先返回。

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

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

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

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

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

- (id)init {
    if (self = [super init]) { // equivalent to "self does not equal nil"
        date = [[NSDate date] retain];
    }
    return self;
}

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

一个类可能有多个初始化方法。例如初始化数据采用不同的形式,又或者某个初始化方法提供缺省值(出于便捷性的考虑),都会出现这种情况。在多个初始化方法中,有一个被称为指定初始化方法,它需取得完整地初始化参数才可执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值