IBOutletsを理解することは、Objective-Cクラスのivarsとプロパティのマーカーとして機能することです。 Objective-Cランタイムに、実行時にivar、プロパティ、またはクラスがIBOutletでマークされているかどうかを照会できるものはありますか?あるいは、XCodeはコンパイル時に何か賢いことをするだけですか?Objective-CランタイムのIBOutletのような構造体
@private
MyMarker MyClass instance;
IBOutletsを理解することは、Objective-Cクラスのivarsとプロパティのマーカーとして機能することです。 Objective-Cランタイムに、実行時にivar、プロパティ、またはクラスがIBOutletでマークされているかどうかを照会できるものはありますか?あるいは、XCodeはコンパイル時に何か賢いことをするだけですか?Objective-CランタイムのIBOutletのような構造体
@private
MyMarker MyClass instance;
はい、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)を作成するほうがよいでしょう。
それは、Interface Builderのは、単にヘッダファイルを読み込み、私の理解である:彼らはランタイム構造であれば
、それはものの独自のマーカーを定義し、この方法でそれらを使用することが可能です。 IBOutletとIBActionは、コンパイルにまったく影響しない、些細な#define:
#define IBOutlet
#define IBAction void
です。 Interface Builderはヘッダーファイルを直接読み込みます(ヘッダーファイルが変更されたときはnotified by Xcodeですが、ヘッダーファイル自体を読み込んで解析するだけです)。
nibファイルがデアーカイブされると、ivarまたはプロパティを使用して値が設定されます。
IBOutlet/IBActionプロパティの存在は保存されず、アクセスすることもできず、独自のプロパティを追加することもできません。
あなたは属性を見て、属性付きのivarに接続できる有用なものがあるかどうかを確認できますが、私は非常にsuです驚いた。