4

Objective-C について、私が混乱する点がいくつかあります。

まず、objective-c ガイドでは、各クラスがそのサブクラスの init メソッドを呼び出す必要があることは非常に明確です。initNSObject から直接継承するクラスがそのメソッドを呼び出す必要があるかどうかについては、少し不明です。これは事実ですか?もしそうなら、それはなぜですか?

次に、NSObject に関するセクションに、次の警告があります。

他のクラスから特別な動作を継承する必要のないクラスは、それでも NSObject クラスのサブクラスにする必要があります。クラスのインスタンスには、実行時に少なくとも Objective-C オブジェクトのように動作する機能が必要です。この機能を NSObject クラスから継承することは、新しいクラス定義で再発明するよりもはるかに簡単で信頼性が高くなります。

これは、すべてのオブジェクトが NSObject から明示的に継承するように指定する必要があるということですか? それとも、すべてのクラスが NSObject のサブタイプである Java/Python/C# のようなものですか? そうでない場合、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は別のルート クラスです。独自のルート クラスを作成したくない、または作成する必要はないでしょうが、それらは存在します。

NSObject の init の呼び出しに関しては、一部はカスタムであり、一部は安全です。NSObject の init は現在何もしないかもしれませんが、将来の動作が変わらないという保証はありません。安全のために init を呼び出します。

于 2009-08-25T20:43:15.833 に答える
0

[super init] を呼び出す必要があります。おそらく実際のメモリ割り当てなど、NSObjects init で記述されているため、記述する必要のない初期化の背後にあるコードがあるためです。

于 2009-08-25T20:33:27.663 に答える