我有以下两个类:
//file FruitTree.h
@interface FruitTree : NSObject
{
Fruit * f;
Leaf * l;
}
@end
//file FruitTree.m
@implementation FruitTree
//here I get the number of seeds from the object f
@end
//file Fruit
@interface Fruit : NSObject
{
int seeds;
}
-(int) countfruitseeds;
@end
我的问题是我如何从f请求种子数量。我有两个选择。
要么:因为我知道 f 我可以明确地调用它,即我实现方法
-(int) countfruitseeds
{
return [f countfruitseeds];
}
或者:我可以使用forwardInvocation:
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
// does the delegate respond to this selector?
if ([f respondsToSelector:selector])
return [f methodSignatureForSelector:selector];
else if ([l respondsToSelector:selector])
return [l methodSignatureForSelector:selector];
else
return [super methodSignatureForSelector: selector];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:f];
}
(请注意,这只是一个提问我问题的玩具示例。我的真实课程有很多的方法,这就是我要问的原因。)
哪种方法更好/更快?
答案 0 :(得分:1)
直接方法实现要快得多。但是如果你想要一个真正的代理对象,那么forwardInvocation:
路由确实是唯一的出路。即使您使用宏来使方法声明非常短,您仍然需要编写所需的所有方法名称,并在添加或删除任何方法时使列表保持最新。