协议:更好地将可选方法实现为存根,还是使用反射?

时间:2013-10-22 16:52:51

标签: objective-c

出于性能原因:

如果我实现委托协议,我的代码执行得更好,委托将所有未使用的方法实现为无操作存根,像这样?

@protocol FooDelegate <NSObject>
- (void) requiredFooThing;
@end

....

// a class which implements FooDelegate:
- (void) requiredFooThing { /* does nothing */ };

或者只是让协议方法可选并使用反射来查看被调用者是否会响应?

@protocol FooDelegate <NSObject>
@optional
- (void) optionalFooThing;
@end

....

// runtime reflection
if([_delegate respondsToSelector:@selector(optionalFooThing)])
{
    [_delegate optionalFooThing];
}

问题是,运行时反射比发送消息更昂贵吗?

1 个答案:

答案 0 :(得分:0)

这是一个非常主观的问题,因此根据您的具体用例,我认为测试是有序的。但我确实记得看到一些关于使用KVO的帖子比特定的子类更昂贵,这个问题似乎也是类似的。我认为反射会比特定的代表协议更昂贵。请记住,您可以将委托方法标记为@ optional / @ required。授权也是一种广泛使用的设计模式。再一次,我认为不可能在所有情况下给出具体的答案。