考虑像:
这样的对象链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需要发布的任何情况。