从NSObject继承如何工作?

时间:2009-08-25 20:27:39

标签: objective-c oop initialization init nsobject

Objective-C有一些让我感到困惑的事情:

首先,在objective-c guide中,很明显每个类都需要调用其子类的init方法。关于直接从NSObject继承的类是否需要调用其init方法,有点不清楚。是这样的吗?如果是这样,那为什么呢?

其次,在关于NSObject的部分中,有这个警告:

  

不需要从另一个类继承任何特殊行为的类应该成为NSObject类的子类。该类的实例必须至少具有在运行时表现为Objective-C对象的能力。从NSObject类继承这种能力比在新的类定义中重新创建它更简单,更可靠。

这是否意味着我需要指定所有对象显式地从NSObject继承?或者这就像Java / Python / C#,其中所有类都是NSObject的子类型?如果没有,是否有理由建立除NSObject之外的根类?

4 个答案:

答案 0 :(得分:6)

1)只要在Objective-C中分配了一个对象,它的内存就会被清零,并且必须通过调用init进行初始化。 NSObject的子类可能有自己专门的init例程,在开头这些例程时,他们应该调用他们的超类“init例程:

self = [super init];

我们的想法是,所有init例程最终都会传播到NSObject init

2)你需要明确继承:

@instance myClass : NSObject { /*...*/ } @end

没有理由拥有除NSObject以外的根类 - 很多Objective-C在很大程度上依赖于这个类,所以试图绕过它会导致你不必要地在脚下射击。< / p>

答案 1 :(得分:2)

因为可以从不同的根基类继承,所以你必须显式声明你在创建任何新类时从NSObject继承(除非你当然已经继承了其他东西,它本身又可能是NSObject的子类)。

几乎从来没有必要制作自己的基类,也不容易这样做。

答案 2 :(得分:1)

Objective-C可以有多个根类,因此您需要明确继承。 IIRC NSProxy是另一个根类。您可能永远不会想要或不需要创建自己的根类,但它们确实存在。

至于调用NSObject的init,它是部分自定义和部分安全性。 NSObject的init现在可能什么也不做,这并不能保证未来的行为不会改变。调用init是安全的。

答案 3 :(得分:0)

你需要调用[super init],因为初始化后面有代码,你不必写,因为它是在NSObjects init中为你编写的,比如可能是实际的内存分配等。