2009-12-02 9 views
5

ドキュメントは言う:NSObjectなしでObjective-Cでルートオブジェクトを作成するには?

厳密 言語の一部は、ISAポインタが Objective-Cランタイムシステムと連携するオブジェクトに対して が必要とされていないが。オブジェクト は構造体 objc_object(objc/objc.hで定義されています) の構造体と同等である必要があります。 の構造体はどのフィールドにも定義されています。しかし、 独自のルートオブジェクトを作成する必要がほとんどありません。 NSObject またはNSProxyから継承するオブジェクトは、自動的にisa という変数を持ちます。

これはうれしいことですが、私はObjective-Cでどのようにルートオブジェクトを作成するのだろうと思いますか?

これは学習目的のためのものです。私はこれを知りたいだけです。私は本当にそれを見たいと思います。

答えて

7

実際には、C#やJavaスタイルの言語から移行している人が「トラップ」になってしまいます。あなたのクラスすなわち

@interface MyNewRoot { 
Class isa; 
} 
@end 

対Javaでは

@interface MyObject : NSObject { 
} 
@end 

またはC#これらと同等になります(最初のケースでは、コンパイラが引き受けるのSystem.ObjectまたはJavaを宣言するときは、単にスーパークラスを指定しません.lang.Objectはスーパークラスでした)、Objective-Cではそのようなデフォルトは仮定されていないので、新しいルートが作成されます。

しかし、あなたは通常、あなたが(新しいインスタンスの割り当てや破棄などのメモリ管理のような単純なものであっても)あなたのクラスの多くの機能を担当しています。これは、あなたが引用したコメントが、struct objc_objectとisaインスタンス変数などについて語ったときのヒントです。

+0

MyNewRootの定義にisaポインタが追加されました。あなたは全くivarsのないオブジェクトを持つことはできません、あなたは少なくともクラスへのポインタを持っている必要があります。 – NSResponder

+0

基本クラス "_ clang warnings"を指定せずにfalseアラーム_ "Class 'MyNewRoot'を定義するのを避けるには、#pragma clang diagnostic pushと#pragma clang diagnostic ignoredを使用してインタフェースをラップすることを検討してください。 -root-class "beforeとそれに続く#pragma clang diagnostic popを実行します。 –

関連する問題