Рассмотрим цепочку объектов, например:
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 потребует выпуска.