0

だから私はこのサイトに不慣れで、質問をする方法の慣習がよくわかりませんが、Objective-C を始めたばかりで、オブジェクトのインスタンス化に関連する質問があります。

さて、ルート クラス NSObject にはクラス メソッド alloc と init があり、これらのメソッドは NSObject を継承するすべてのクラス (ほぼすべてのクラス) に渡されます。オブジェクトをインスタンス化するための典型的な形式は次のようなものです。

MyObject *m = [[MyObject alloc]init];

しかし、MyObject が NSObject から継承された alloc および init メソッドを持っていることを考慮すると、MyObject と NSObject が同じ alloc および init メソッドを持っていることを考えると、これは理論的には機能する可能性があります (クラスがそれらをオーバーライドしないと仮定します)。

MyObject *m = [[NSObject alloc] init];

インスタンス化するだけで機能しますが、MyObject クラスのメソッドを呼び出そうとすると、NSException がスローされます。NSObject 割り当てを MyObject 割り当てに戻すと、機能します。理由がわかりません!これはおそらく基本的な質問ですが、何か説明はありますか?

前もって感謝します!

ジェイク

4

2 に答える 2

3

ロジックは同じですが、メッセージの実装に渡されるクラス オブジェクトは異なりますalloc。最初のケースでは、コンパイラはコードを次のように変換します。

objc_msgSend([MyObject class], @selector(alloc)];

したがって、 alloc の実装はクラスのインスタンスを作成しますMyObject。しかし、あなたが書く[NSObject alloc];と、それはに変換されます

objc_msgSend([NSObject class], @selector(alloc)];

したがって、プレーンな NSObject インスタンスが作成されますが、これは明らかにクラスのメッセージに応答しません。

于 2012-07-21T17:56:52.880 に答える
2
[[NSObject alloc] init]

MyObject *m = [[NSObject alloc] init];MySubClassMyClass *obj = [[MySubClass alloc ] init];は MyClass でもあるため、NSObject を作成します。

于 2012-07-21T17:55:46.683 に答える