2012-07-25 121 views
0

我想从一个Objective-C类获取实例变量的名称。假设我的课程如下所示:如何在Objective-C中获取实例变量的名称?

@interface MyClass : NSObject 

@property (nonatomic, copy) NSSNumber *myVar; 

@end 

鉴于myVar,我希望得到“myVar”。然后我可以在这样的日志中使用它:

MyClass *myObject = [[myClass alloc] init]; 
NSLog(@"The variable is named: %@", getVarName([myObject myVar])); 

然后日志会说:The variable is named myVar。感谢您的帮助!

PS我想这样做的原因是创建一个编码变量进行归档的方法。所以,当我写我encodeWithCoder方法我可以做这样的事情:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    NSArray *varsForEncoding = [[NSArray alloc] initWithObjects:var1, var2, var3, nil]; 
    for (NSObject *var in varsForEncoding) 
    { 
     [aCoder encodeObject:var forKey:getVarName(var)]; 
    } 
} 

然后做反向的initWithCoder。这样可以避免错字,例如,在编码时使用密钥@"myVar",但在初始化器中键入@"mVar"

回答

7

你可以用这个方法尝试:

//returns nil if property is not found 
-(NSString *)propertyName:(id)property { 
    unsigned int numIvars = 0; 
    NSString *key=nil; 
    Ivar * ivars = class_copyIvarList([self class], &numIvars); 
    for(int i = 0; i < numIvars; i++) { 
    Ivar thisIvar = ivars[i]; 
    if ((object_getIvar(self, thisIvar) == property)) { 
     key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; 
     break; 
    } 
    } 
    free(ivars); 
    return key; 
} 

source

+1

工作很好,谢谢。我只需链接到libobjc.dylib并导入。 – 2012-07-25 22:52:55

0

只需使用一个单一的代码行,因为这。

#define NSLogVariable(x) NSLog(@"Variable : %s = %@",#x,x) 

与头宏定义它沿和在任何地方使用它。 如:

NSString *[email protected]"abcd"; 
NSLogVariable(myObj); 

它会显示

Variable : myObj = "abcd" 

希望它可以帮助一些之一。