簡體   English   中英

我如何獲得ivar的Objective-C類?

[英]How do I get the Objective-C class of an ivar?

我在單元測試中創建了一堆簡單的NSManagedObject 它們只有一個NSString *類型的name屬性。 我總是給我的NSManagedObject相同的entityNameClass名稱。

我想避免編寫以下代碼30次來設置單元測試:

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

- (void) setUp {
  [super setUp];

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

由於foo是一個ivar,我認為我應該能夠編寫一個宏來獲取fooFoo )的類型,並用來創建我的Foo

#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 class_getInstanceVariable(Class cls, const char* name)的objective-c運行時IVar來確定類型,但是來自ivar_getTypeEncoding的類型編碼中唯一可用的IVar類型信息是id ,這不是足夠。

有人能想到一種在編譯時或運行時獲取IVar類型信息的方法嗎?

我沒有嘗試從ivar獲取類信息,但我知道@property聲明會對該類的信息進行編碼。 例如,這個屬性聲明:

@property (copy) NSString *normalString;

在運行時生成此屬性字符串(使用property_getAttributes()檢索):

T@"NSString",C,VnormalString

我已經為這些信息編寫了一些開源解析代碼

獲得類名后,可以使用NSClassFromString()將其轉換為實際的Class對象,並從那里發送結果。

免責聲明:這可能不應該依賴於生產應用程序,因為它沒有文檔記錄。

idid 在運行時,所有Objective-C對象都具有相同的類型( objc_object )。 這與ObjC的動態性質有關。 例如,對象可以在運行時更改類,可以創建新類,並且可以更改類層次結構。 您可以詢問特定實例的類型(因為它存儲在objc_object ),但指向對象的指針只是指向對象的指針。 甚至還不到:它實際上只是一個指向C結構的指針,它恰好在末尾分配了額外的內存(用於保存子類ivars)。

您的宏似乎很有趣,但您可能需要將類名作為第二個參數傳遞而不是自動檢測它。

也許我誤解了你想要實現的目標。 要獲得iVar的類,你不能使用iVar的方法嗎?

喜歡:

NSString *aString = @"random string";
NSLog(@"%@",NSStringFromClass([aString class]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM