使用选择器评估对象链

时间:2012-03-21 22:28:29

标签: objective-c ios selector

考虑像:

这样的对象链
foo.bar.baz.bing

在这个特定的例子中,我被赋予foo,我希望评估方法bing。在代码中,我将执行以下操作:

[[[foo bar] baz] bing];

或者,如果bing是属性,我可以这样评价:

id result = foo.bar.baz.bing;

现在考虑我以NSString对象的形式给予foo然后bar.baz.bing的情况。我想出了以下方法来评估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;
}

注意:上面的代码示例是为了证明这一点。我知道使用这样的方法调用initalloccopymutableCopynew的危险。代码中的实际使用是经过精心管理的,以避免ARC需要发布的任何情况。

1 个答案:

答案 0 :(得分:1)

使用Key-Value Coding

[parentObject valueForKeyPath:objectChain];