Атрибут самоанализ для получения переменной в Objective-C - PullRequest
3 голосов
/ 18 января 2010

Учитывая переменную id x и строку NSString *s, как я могу получить атрибут экземпляра с именем s для переменной x?

т.е.Если мы напишем NSString *s=@"a", то мы хотим x.a

Ответы [ 2 ]

14 голосов
/ 18 января 2010

Справочник по времени выполнения Objective C 1002 * списки

Ivar class_getInstanceVariable(Class cls, const char * name)

, который возвращает непрозрачный тип, представляющий переменную экземпляра в классе. Затем вы передаете это

id object_getIvar(id object, Ivar ivar)

чтобы получить фактическую переменную экземпляра. Так что вы могли бы сказать

#import <objc/runtime.h>

id getInstanceVariable(id x, NSString * s)
{
    Ivar ivar = class_getInstanceVariable([x class], [s UTF8String]);
    return object_getIvar(x, ivar);
}

если переменная экземпляра является объектом. Однако, если переменная экземпляра не является объектом, вызовите

Ivar object_getInstanceVariable(id obj, const char * name, void ** outValue)

передача указателя на переменную правильного типа. Например, если переменная экземпляра является int,

int num;
object_getInstanceVariable(x, [s UTF8String], (void**)&num);

установит num в значение целочисленной переменной экземпляра.

5 голосов
/ 18 января 2010

При условии, что x соответствует кодированию значения ключа для свойства a, вы можете просто сделать это:

id result = [x valueForKey:s]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...