2013-04-09 157 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