Objective-C有一些让我感到困惑的事情:
首先,在objective-c guide中,很明显每个类都需要调用其子类的init方法。关于直接从NSObject继承的类是否需要调用其init
方法,有点不清楚。是这样的吗?如果是这样,那为什么呢?
其次,在关于NSObject的部分中,有这个警告:
不需要从另一个类继承任何特殊行为的类应该成为NSObject类的子类。该类的实例必须至少具有在运行时表现为Objective-C对象的能力。从NSObject类继承这种能力比在新的类定义中重新创建它更简单,更可靠。
这是否意味着我需要指定所有对象显式地从NSObject继承?或者这就像Java / Python / C#,其中所有类都是NSObject的子类型?如果没有,是否有理由建立除NSObject之外的根类?
答案 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中为你编写的,比如可能是实际的内存分配等。