![](/img/trans.png)
[英]can i add an ivar (or property) to an existing class in objective-c?
[英]How do I get the Objective-C class of an ivar?
我在單元測試中創建了一堆簡單的NSManagedObject
。 它們只有一個NSString *
類型的name
屬性。 我總是給我的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
由於foo
是一個ivar,我認為我應該能夠編寫一個宏來獲取foo
( Foo
)的類型,並用來創建我的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對象,並從那里發送結果。
免責聲明:這可能不應該依賴於生產應用程序,因為它沒有文檔記錄。
id
是id
。 在運行時,所有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.