考虑一个对象链,如:
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;
}
注意:上面的代码示例是为了证明这一点而设计的。我知道使用这样的方法调用init
、alloc
、copy
、mutableCopy
或new
的危险性。代码中的实际使用是非常小心地管理的,以避免ARC需要发布的任何情况。
使用键值编码。
[parentObject valueForKeyPath:objectChain];