2013-04-09 210 views
0

我在閱讀文本文件。我想檢查在類中聲明的變量是否與我從文件中讀取的文本名稱相同。'java.lang.Class.getDeclaredField()'的ObjectiveC中的類似方法'

這個在java中的方法是'java.lang.Class.getDeclaredField()'。詳細信息請參見http://www.tutorialspoint.com/java/lang/class_getdeclaredfield.htm

我無法在ObjectiveC中找到類似的方法。有沒有?如果否,我如何才能實現相同。如果你有任何想法,請給我幾點建議。

+0

http://stackoverflow.com/questions/2299841/objective-c-introspection-reflection。看看第一個答案 – giorashc 2013-04-09 06:14:58

+0

@afsal:你確定你需要伊娃嗎?那麼像@ property/@ synthesize這樣的東西將沒有財產? – 2013-04-09 06:24:18

+0

@AnoopVaidya是的。我確定。 例如 長ID; NSString *名字; – 2013-04-09 11:18:05

回答

1

您可以檢查這樣的:/ 房產/

YourClass *arrObj=[YourClass new];//your target class where you wnat to check 
NSString *[email protected]"samllArray";//this is what you will check in class YourClass 
if([arrObj respondsToSelector:NSSelectorFromString(propertyName)]){ 
    NSLog(@"yes, exists"); 
} 
else{ 
    NSLog(@"no, it does not exists"); 
} 

編輯:/ 爲高德/

- (NSMutableArray *)getAllPropertyOfClass:(Class)aClass { 
    NSMutableArray *mArray=[NSMutableArray new]; 
    unsigned int outCount; 
    Ivar *ivars = class_copyIvarList([aClass class], &outCount); //class_copyPropertyList([aClass class], &outCount); 

    for(unsigned int i = 0; i < outCount; i++) { 
     Ivar ivar = ivars[i]; 
     const char *propName = ivar_getName(ivar); 
     if(propName) { 
      NSString *propertyName = [NSString stringWithUTF8String:propName]; 
      mArray[mArray.count]=propertyName; 
     } 
    } 
    free(ivars); 
    return mArray; 
} 
+1

關閉,但是再一次,這是對實際內省/反射的糟糕替代,並且它沒有考慮iVars。首選此方法中概述的運行時方法。 – CodaFi 2013-04-09 06:18:59

+0

我以爲obj運行時將會更昂貴 – 2013-04-09 06:19:31

+0

您的方法檢查類是否實現'samllArray'方法,而不是如果有一個名爲'samllArray'的實例變量。 – 2013-04-09 06:20:47

-1

respondsToSelectorconformsToProtocol方法也許他們可以幫助

+1

這些與動態內省/反思無關。 Java中的字段類似於iVar,而不是協議。 – CodaFi 2013-04-09 06:17:28