如何在Objective-C中获取实例变量的名称?

时间:2012-07-25 21:28:59

标签: objective-c ios variables encoding metadata

我正在尝试从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"

2 个答案:

答案 0 :(得分: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 :(得分:0)

只需使用一行代码即可。

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

将标题与标题一起定义为宏,并在任何地方使用。 例如:

NSString *myObj=@"abcd";
NSLogVariable(myObj);

它会显示

Variable : myObj = "abcd"

希望对某人有所帮助。