2

IBOutlets についての私の理解では、IBOutlets は Objective-C クラスの ivar とプロパティへのマーカーとして機能するということです。Objective-C ランタイムには、ivar、プロパティ、またはクラスが実行時に IBOutlet でマークされているかどうかを照会できるものはありますか? それとも、XCode はコンパイル時にこれらを巧妙に処理するのでしょうか?

それらがランタイム構成である場合、独自のマーカーを定義して次のように使用することは可能ですか:

@private
    MyMarker MyClass instance;
4

2 に答える 2

5

私の理解では、Interface Builder は単にヘッダー ファイルを読み取るだけです。IBOutlet と IBAction は単純な #define です。

#define IBOutlet
#define IBAction void

コンパイルにはまったく影響しません。Interface Builder はヘッダー ファイルを直接読み取ります (ヘッダー ファイルが変更されると Xcode から通知されますが、ヘッダー ファイル自体を読み取って解析するだけです。

nib ファイルが dearchive されると、値は通常のインターフェイスを介して ivar またはプロパティを使用して設定されますが、ivar/プロパティが Interface Builder で使用可能であることは特筆すべきことではありません。

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

属性を見て、属性を使用して ivar にアタッチできる便利なものがあるかどうかを確認できますが、非常に驚​​かれることでしょう。

于 2009-07-29T07:23:05.903 に答える
2

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

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

プロパティ/ivar を操作して別の 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) を作成することをお勧めします。

于 2009-07-29T19:15:04.780 に答える