4

关于 Objective-C 有几件事让我感到困惑:

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

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

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

这是否意味着我需要明确指定所有对象都从 NSObject 继承?或者这就像 Java/Python/C# 中的所有类都是 NSObject 的子类型?如果没有,是否有任何理由制作 NSObject 以外的根类?

4

4 回答 4

6

1) 任何时候在 Objective-C 中分配一个对象时,它的内存都会被清零,并且必须通过调用init. 的子类NSObject可能有自己的专门init例程,在开始时它们应该调用它们的超类的init例程,如下所示:

self = [super init];

这个想法是所有的init例程最终都会滴到NSObject's init

2)您需要明确继承:

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

没有理由有一个根类,除了NSObject——很多 Objective-C 严重依赖这个类,所以试图绕过它会导致你不必要地自取其辱。

于 2009-08-25T20:31:24.547 回答
2

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

几乎从来不需要创建自己的基类,也不容易做到。

于 2009-08-25T20:38:32.553 回答
1

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

As for calling NSObject's init, it's part custom and part safety. NSObject's init may not do anything now, that's no guarantee that future behaviour won't change. Call init to be safe.

于 2009-08-25T20:43:15.833 回答
0

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

于 2009-08-25T20:33:27.663 回答