2009-09-24 27 views
1

这些都是相当简单的问题,但有些事,我想在继续之前,我的头得到的权利...对象化妆,它的构造如何?

@interface BasicTire : NSObject { 
} 
@end 

@interface SnowTire : BasicTire { 
} 
@end 
  1. 当你调用[SnowTire的init]附带的[超级初始化]调用[BasicTire init],然后调用[NSObject init]? (即级联运行到父级/超级类别

  2. 当您[SnowTire alloc]创建单个新对象时,包括其superClass的功能。我是否认为不创建多个对象以某种方式链接(即SnowTire> BasicTire> NSObject的)。

只是想检查...

加里

回答

3
  1. 是的,通常初始化器调用超类初始化器。这是在执行init方法时明确完成的。虽然可以调用同一个类或其超类的其他初始化方法,但有必要确保总是调用"designated initializer"
    如果一个对象没有实现init(或者初始值设定器),则调用超类中的对象(就像使用其他方法一样)。这并不少见,因为Objectve-C中的变量总是初始化为0(在alloc中),所以通常不需要实现专门的init

  2. alloc只是分配内存并设置确定对象类的对象的“isa指针”。你从它得到的是一个未初始化的对象(不是链表),它的所有实例变量(包括超类)都有空间。

+0

完美,谢谢尼古拉 – fuzzygoat 2009-09-24 14:01:52

2
  1. 是。每个初始化器都必须调用超类的指定初始化器,一直到NSObject。每个初始化程序将来自超级初始化程序的结果分配给自己也很重要。由于初始化器不需要返回发送初始化消息的同一个实例。

  2. 是的。 alloc为堆对象实例变量初始化足够的内存,并用零清零此内存。这样所有的指针将会是nil,布尔值false等。然后它将isa指针设置为新对象的类。

1

当你调用[SnowTire的init]附带的[超级初始化]调用[BasicTire的init]这反过来又调用[NSObject的初始化] (即运行到父/超级联

你同时实现-[SnowTire init]-[BasicTire init],所以你可以看看你实现看出:

  1. -[SnowTire init]使用[super init]调用-[BasicTire init]
  2. 您的-[BasicTire init]使用[super init]致电-[NSObject init]

[super init]总是调用下一个可用的实现,即使它不在您的直接超类中。如果您未执行-[BasicTire init],则-[SnowTire init]中的[super init]表达式将调用-[NSObject init]。这很好,因为你显然决定一个BasicTire不需要任何初始化。 (如果是这样,那么你的-[BasicTire init]遗漏是个错误。)

当你[SnowTire页头]你正在创建一个新的对象,包括其超类的功能。我认为你不要创建以某种方式链接的多个对象(即SnowTire> BasicTire> NSObject)。

是的。每个对象都有一个类(在名为isa的变量中,如“此实例 SnowTire”),每个类都有一个超类和一个元类。和所有的Objective-C方法和C函数一样,每个函数都只返回一个东西,在这种情况下,只有一个实例带有一个类。

因此,例如,当您向您的雪地轮胎发送gripTheSnow消息时,它会使用SnowTire对该方法的实施。如果您发送retain消息,那么您在SnowTire中没有实现retain,并且您没有在BasicTire中实现它,因此它使用NSObject的实现。运行时搜索从对象的类(在此示例中为SnowTire)开始,沿着直线沿着类层次结构向上搜索,结束于诸如NSObject的根类。