我正在尝试从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"
。
答案 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"
希望对某人有所帮助。