Оценка цепочки объектов с помощью селекторов - PullRequest
0 голосов
/ 22 марта 2012

Рассмотрим цепочку объектов, например:

foo.bar.baz.bing

В данном конкретном случае мне дают foo, и я хочу оценить метод bing. В коде я бы сделал следующее:

[[[foo bar] baz] bing];

Или, если бы bing было свойством, я мог бы оценить его таким образом:

id result = foo.bar.baz.bing;

Теперь рассмотрим ситуацию, когда мне дают foo, а затем bar.baz.bing в форме объекта NSString. Я придумал следующий метод для оценки до bing, но мне интересно, есть ли более простой способ сделать это.

- (id)evaluator:(id)parentObject withChain:(NSString *)objectChain
{
    id currentObject = parentObject;

    for (NSString *component in [objectChain componentsSeparatedByString:@"."])
    {

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        currentObject = [currentObject performSelector:NSSelectorFromString(component)];
#pragma clang diagnostic pop
    }
    return currentObject;
}

Примечание. Приведенный выше пример кода был придуман для демонстрации сути. Мне известно об опасности вызова init, alloc, copy, mutableCopy или new с использованием такого метода, как этот. Фактическое использование в коде очень тщательно управляется, чтобы избежать любых ситуаций, когда ARC потребует выпуска.

1 Ответ

1 голос
/ 22 марта 2012

Использование Кодирование значения ключа .

[parentObject valueForKeyPath:objectChain];
...