当你调用[SnowTire的init]附带的[超级初始化]调用[BasicTire的init]这反过来又调用[NSObject的初始化] (即运行到父/超级联
你同时实现-[SnowTire init]
和-[BasicTire init]
,所以你可以看看你实现看出:
- 你
-[SnowTire init]
使用[super init]
调用-[BasicTire init]
。
- 您的
-[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的根类。
完美,谢谢尼古拉 – fuzzygoat 2009-09-24 14:01:52