2012-04-14 34 views
4

這裏是比較操作我想這樣做:如何使用ivar_getTypeEncoding&encode動態確定和比較對象ivars的類型?

// foobar is the name of an ivar on some class 
// i.e. NSDate *foobar; 
const char *ivarType = [self getTypeForInstanceVariableWithName:@"foobar"]; 
const char *objType = @encode(NSDate); 

if (strcmp(ivarType, objType) == 0) { 
    //set value 
} 

NSLog(@"comparing %s with %s", ivarType, objType); 

Helper方法:

- (const char*)getTypeForInstanceVariableWithName:(NSString *)name { 
    return ivar_getTypeEncoding(class_getInstanceVariable([self class], [name cStringUsingEncoding:NSUTF8StringEncoding])); 
} 

的NSLog結果:

comparing @"NSDate" with {NSDate=#} 

如何合作me @encode返回與ivar_getTypeEncoding()不同的類型語法?有沒有更好的方法來完成這種類型的確定?我必須在這裏失去一些東西... 謝謝!

回答

5

當使用ivar_getTypeEncoding()時,您必須注意第一個字符。讓我們來看一個例子:

如果你有一個基本類型的第一個字符將是你所得到的,爲INT這將是「我」,爲焦炭「C」,爲無符號長長「 Q'等等...

對於對象和類,您可能會獲得更多,比如您的示例,但第一個字符就是您想要的內容,如@代表對象,#代表類,代表選擇器。

您可以閱讀關於這些類型here。你也可以在比較時使用常量,比如_C_ID,_C_CLASS等。在runtime.h有一個戰利品。 C數組似乎更棘手,但我相信你可以解決這個問題。

你的代碼中的一個問題是你得到NSDate類的類型編碼,而不是NSDate對象。因此,而不是比較@encode(NSDate)與@encode(NSDate *)的比較。

例如,要查看這種類型的代碼,請參見Adium's code

+0

太棒了!感謝您的幫助,非常感謝! – MTurner 2012-04-17 23:44:48