0

我正在尝试从 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"在编码时使用 key 但@"mVar"在初始化程序中键入。

4

2 回答 2

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;
}  

来源

于 2012-07-25T21:32:35.173 回答
0

只需使用一行代码即可。

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

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

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

它会显示

Variable : myObj = "abcd"

希望对某人有所帮助。

于 2015-08-05T11:25:07.373 回答