5

NSManagedObject単体テストで作成する単純なものがたくさんあります。nameタイプの属性は1つだけNSString *です。私はいつもNSManagedObject同じ名前entityNameを付けます。Class

単体テストを設定するために次のコードを30回記述する必要はありません。

@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest

- (void) setUp {
  [super setUp];

  foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
                                      inManagedObjectContext:managedObjectContext];
  foo.name = @"foo";
}
@end

はivarなので、 ( )の型を取得するマクロを記述して、 :を作成するために使用fooできるはずです。fooFooFoo

#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)

ただし、これによりclangで次の警告が発生します。

variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
                                                                               ^
                                                             Expected expression

IVarまた、からのObjective-cランタイムを使用してタイプを判別できると思いましたが、からのタイプエンコーディングから入手できるタイプ情報はIvar class_getInstanceVariable(Class cls, const char* name)、だけでは不十分です。IVarivar_getTypeEncodingid

IVar誰かがコンパイル時または実行時にのタイプ情報を取得する方法を考えることができますか?

4

3 に答える 3

7

ivarからクラス情報を取得しようとしたことはありませんが、@property宣言がクラスに関する情報をエンコードしていることは知っています。たとえば、このプロパティ宣言は次のとおりです。

@property (copy) NSString *normalString;

実行時にこの属性文字列(property_getAttributes()を使用して取得)になります。

T@"NSString",C,VnormalString

この情報のために、いくつかのオープンソース解析コードを作成しました。

クラス名を取得したら、 NSClassFromString()を使用してそれを実際のClassオブジェクトに変換し、そこから結果をメッセージで送信できます。

免責事項:これは文書化されていないため、本番アプリケーションではおそらく依存すべきではありません。

于 2012-06-29T20:52:25.060 に答える
5

idですid。実行時には、すべてのObjective-Cオブジェクトは同じタイプ(objc_object)になります。これは、ObjCの動的な性質に関係しています。たとえば、オブジェクトは実行時にクラスを変更したり、新しいクラスを作成したり、クラス階層を変更したりできます。特定のインスタンスにそのタイプを尋ねることができますが(これはに格納されているためobjc_object)、オブジェクトへのポインターはオブジェクトへのポインターにすぎません。それよりもさらに少ないです。これは、実際には、最後に追加のメモリが割り当てられている(サブクラスのivarを保持するための)C構造体への単なるポインタです。

マクロは面白そうですが、クラス名を自動検出するのではなく、2番目のパラメーターとして渡す必要があります。

于 2012-06-29T17:34:03.843 に答える
0

多分私はあなたが達成しようとしていることを誤解しています。iVarのクラスを取得するには、iVarのclassメソッドを使用できませんか?

お気に入り:

NSString *aString = @"random string";
NSLog(@"%@",NSStringFromClass([aString class]));
于 2012-06-29T17:22:35.907 に答える