无论如何从变量名获取字符串?

时间:2010-03-20 21:07:20

标签: objective-c nsstring

说我有我的班级

@interface Person : NSObject { NSString *name; }

我需要在班级中获得NSString的名称

Person *person = [[Person alloc] init];
NSLog(@"Name of variable %s\n", _NameofVariable_(person->name));

感谢您的回答,这是我从回复中提出的解决方案

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

5 个答案:

答案 0 :(得分:35)

一样简单

#define VariableName(arg) (@""#arg)

然后你做:

NSObject *obj;
NSString *str = VariableName(obj);
NSLog(@"STR %@", str);//obj

答案 1 :(得分:4)

您可以使用Objective-C runtime API函数class_copyIvarList获取类的实例变量的名称。然而,这是相当复杂的,很少完成,几乎从来不是完成某事的最佳方式。如果你有一个更具体的目标而不仅仅是好奇心,那么询问如何在Objective-C中完成它可能是一个好主意。

此外,顺便说一句,person.name没有在Objective-C中指定实例变量 - 它是属性调用。实例变量为person->name

答案 2 :(得分:2)

您可以使用预处理器字符串化和一些字符串twiddling:

NSUInteger lastIndexAfter(NSUInteger start, NSString *sub, NSString *str) {
    NSRange found = [str rangeOfString:sub options:NSBackwardsSearch];
    if(found.location != NSNotFound) {
        NSUInteger newStart = NSMaxRange(found);
        if(newStart > start)
            return newStart;
    }
    return start;
}

NSString *lastMember(NSString *fullName) {
    if(!fullName) return nil;

    NSUInteger start = 0;
    start = lastIndexAfter(start, @".", fullName);
    start = lastIndexAfter(start, @"->", fullName);

    return [fullName substringFromIndex: start];
}

#define NSStringify(v) (@#v)
#define _NameofVariable_(v) lastMember(NSStringify(v))

答案 3 :(得分:0)

如果person对象作为类的属性公开,则可以使用objc_msgSend来获取值。

因此,如果您可以使用

访问此人
[object person]

您也可以

objc_msgSend(object, "person")

有关消息发送的更多详细信息,包括如何将参数传递给方法,请参阅Objective-C Runtime Programming Guide section on Messaging

答案 4 :(得分:0)

以下用作宏:

#define STRINGIZE(x) #x