对象的初始化

来源:互联网 发布:淘宝评分影响 编辑:程序博客网 时间:2024/04/30 23:48

对象的初始化

初始化对象和设置初始值的过程通常可以合并到一个方法中。包含很多方法和实例变量的类通常还有几个初始化方法。例如:Foundation框架中的NSArray类中包含以下6 个初始化方法:

initWithArray:

initWithArray:copyltems:

intWithContentsOfFile:
initWithContentsOfURL:

initWithObjects:

initWithObjects:count:

常见的初始化方法都以init开头,可以看到,NSArray的初始化方法遵循了这个管理。

在编写初始化方法时,如果希望在类对象初始化时做一些事情,例如:在创建类的对象时需要使用和引用到一个或多个实例变量,可以通过覆写init方法达到目的,init覆写的模板为:

- (id) init 

{

self = [super init];

if(self ) {

//初始代码

}

return self;

}

这个方法调用父类的初始化方法,使的继承的实例变量能够正常初始化。并且必须将父类的init方法执行结果赋给self,因为初始化过程改变了对象在内存中的位置。注释说明可以在那插入自定义的初始化代码,通常可以在这个位置创建并初始化实例变量。

如果你你的类包含多个初始化方法,其中一个应该是指定的初始化方法,并且其他所有的初始化方法都应该使用这个方法,通常这个方法应该是最复杂的初始化方法(一般是参数最多的方法)。任何人要想从该类派生子类,都可以重载这个指定的初始化方法,确保正确初始化新的实例。

基于这个讨论,Fraction类的初始化方法initWith:over:可能如下:

- (Fraction  *)initWith: (int) n over: (int ) d

{

self = [super init];

if(self ) {

[self setTo: n over: d];

}

return self;

}

为了使用指定的初始化规则,你需要修改Fraction 类的init方法。这一点尤其是作为子类时特别注意。init方法如下:

- (id) init 

{

return [self initWith: 0 over:0];

}

注意,ini方法的返回类型被定义为id类型,这是编写可能会被继承的的类的init方法的一般规则。你并不想编码一个类名,比如子类的对象并不等同于父类的对象。为保持一致,initWith:over:方法也将返回类型改为id。

0 0
原创粉丝点击