前进调用,手工与魔法?

时间:2010-05-28 01:41:15

标签: objective-c cocoa

我有以下两个类:

//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];
}

(请注意,这只是一个提问我问题的玩具示例。我的真实课程有很多的方法,这就是我要问的原因。)

哪种方法更好/更快?

1 个答案:

答案 0 :(得分:1)

直接方法实现要快得多。但是如果你想要一个真正的代理对象,那么forwardInvocation:路由确实是唯一的出路。即使您使用宏来使方法声明非常短,您仍然需要编写所需的所有方法名称,并在添加或删除任何方法时使列表保持最新。