2017-01-30 8 views
-1

私はファイルの@interfaceブロックで宣言された変数がほとんどありません。それらは.mファイルに割り当てられています。私の@interface(好ましいクラスメソッド)の1つのメソッドでは、これらの変数をリフレクションで列挙したいと思いますが、私は全く考えられません。私のコードの 例:C型バースの目的Cリフレクション

Consts.h 

extern NSString *MyConst1; 
extern NSString *MyConst2; 

Consts.m 

NSString *MyConst1 = nil; 
NSString *MyConst2 = nil; 

+ (void)load { 
    MyConst1 = ...; 
    MyConst2 = ...; 
} 

+ (void)someMethod { 
    // i could use class_copyIvarList for objective c properties/ivars, 
    // but is it possible to get that MyConts1 and MyConst2 via reflection ? 
    // I understand, that C have different namespace, 
    // and I have no experience with it. 
} 
+0

Cではリフレクションはありません。値を列挙するには、配列に配置します。値を設定したい場合は、その値を指すポインタを列挙します。 – Sulthan

+0

@Sulthanを配列に入れることは明らかです。私は重複したコードをたくさん作ってはいけないと思っています。たぶんobjcにCのランタイムマジックがありますか? @インタフェースに置かれた変数に違いがあるので、objcを使って何らかの形で反映させることができますか? –

+0

Objective-CはCに対して魔法をしません。Objective-Cは、* Obj-C *オブジェクトのリフレクションを可能にする追加のメタデータとともに、C構造から構成されたオブジェクトを作成します。しかし、CはちょうどCです。 – Sulthan

答えて

0

のObjective-Cは、Objective-Cのオブジェクトのための反射をサポートしています。すべてのObj-Cクラスに必要なメタデータ(プロパティ名、メソッド名など)が含まれているため、反映が機能します。

Objective-Cは決してC言語を変更しません。 Objective-Cランタイムは基本的にCで実装され、コンパイラはObjective-CをC関数呼び出しに変換するだけです。

いいえ、Objective-Cクラスのコンテキスト外でグローバル変数にリフレクションを使用することはできません。

リフレクションが必要な場合は、クラスにラップします。

ただし、反射を使用することはほとんど決して良い解決策ではありません。通常、それは悪いアーキテクチャによって引き起こされる問題を解決するために悪用されます。

0

ObjCにはクラス変数はありません。インスタンスのみがObjCに変数を持つことができます。 @interfaceまたは@implementationと@endの間でグローバルを宣言しても、ObjCは実際にはそれを知ることはできません。

.mファイルのObjC部分のみがイントロスペクションをサポートします。代わりの方法として、定数を返すメソッドを持つシングルトンを作成し、そのメソッドを列挙することができます。また、定数の配列を返す関数/メソッドを作成することもできます。あなたの定数、配列の重複を避けるために、あなたはXマクロ技術を使用することができます。

#define OSC_TYPE_CONSTANTS X(MyConst1) \ 
          X(MyConst2) 

// Header: 
#define X(n) extern NSString* n; 
OSC_TYPE_CONSTANTS 
#undef X 

// Implementation: 
#define OSC_STRINGIFY(n) #n 
#define X(n) NSString* n = OSC_STRINGIFY(n); 
OSC_TYPE_CONSTANTS 
#undef X 

#define X(n) n, 
NSArray* gAllTypesArray = [NSArray arrayWithObjects: OSC_TYPE_CONSTANTS nil]; 
#undef X 

あなたはこれを何が必要ですか?これらの定数はアプリに直接コンパイルされていますか、エクスポートされたフレームワーク内にありますか?それに応じて、CFBundleのCFBundleGetDataPointerFromNameまたはdlsymを含むソリューションが存在する可能性があります。