使用选择器评估对象链



考虑一个对象链,如:

foo.bar.baz.bing

在这个特定的例子中,我得到了foo,并且我希望评估方法bing。在代码中,我会做以下操作:

[[[foo bar] baz] bing];

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

id result = foo.bar.baz.bing;

现在考虑这样一种情况,即以NSString对象的形式给我foobar.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需要发布的任何情况。

使用键值编码。

[parentObject valueForKeyPath:objectChain];

相关内容

  • 没有找到相关文章

最新更新