2009-07-29 13 views
2

IBOutletsを理解することは、Objective-Cクラスのivarsとプロパティのマーカーとして機能することです。 Objective-Cランタイムに、実行時にivar、プロパティ、またはクラスがIBOutletでマークされているかどうかを照会できるものはありますか?あるいは、XCodeはコンパイル時に何か賢いことをするだけですか?Objective-CランタイムのIBOutletのような構造体

@private 
    MyMarker MyClass instance; 

答えて

2

はい、IBOutletとIBActionは、プリコンパイルの段階でパーサによって破棄されます。したがって、コンパイルされた出力には何もありません。また、上記のように、Interface Builderによってテキスト処理されているため、接続ウィンドウで使用可能なプロパティ/メソッドのサブセットを知ることができます。

しかし、これは同じことを自分でやってくれるわけではありません。プリプロセッサでコンパイルされた#defineを定義し、テキスト処理を使ってそれらを操作するだけです。しかし、これらのどれも実行時には利用できません。つまり、あなたが提案したことを実際に行うことはできません。

プロパティ/ ivarの操作を行うマクロを作成し、別の情報に追加情報を追加することは技術的に可能です。例えば:

#define OUTLET(type,name) type name;BOOL property_##name; 
@interface Foo : NSObject 
{ 
     OUTLET(NSString*,foo); 
} 
@end 

@interface Foo :NSObject 
{ 
    NSString* foo; 
    BOOL property_foo; 
} 
@end 

に拡大すると、あなたはその後、(実行時と同様に、コンパイル時に検出可能であるべきである)あなたのコードで何かをするproperty_fooの存在を使用することができます。

私はこれを一般的にやってみることをお勧めしません...まず、あなたのインターフェース(したがってメモリオブジェクト)を必要以上に大きくします。必要な追加情報を保持するために独自のクラス(またはtypedef)を作成するほうがよいでしょう。

4

それは、Interface Builderのは、単にヘッダファイルを読み込み、私の理解である:彼らはランタイム構造であれば

、それはものの独自のマーカーを定義し、この方法でそれらを使用することが可能です。 IBOutletとIBActionは、コンパイルにまったく影響しない、些細な#define:

#define IBOutlet 
#define IBAction void 

です。 Interface Builderはヘッダーファイルを直接読み込みます(ヘッダーファイルが変更されたときはnotified by Xcodeですが、ヘッダーファイル自体を読み込んで解析するだけです)。

nibファイルがデアーカイブされると、ivarまたはプロパティを使用して値が設定されます。

IBOutlet/IBActionプロパティの存在は保存されず、アクセスすることもできず、独自のプロパティを追加することもできません。

あなたは属性を見て、属性付きのivarに接続できる有用なものがあるかどうかを確認できますが、私は非常にsuです驚いた。

関連する問題