为什么在没有实现的情况下在类别中声明方法?

时间:2009-04-07 12:22:06

标签: objective-c cocoa

我正在阅读开源项目的源代码,我在实现文件中遇到了以下类别定义:

@interface QCView (Private)
- (void)_pause;
- (void)setClearsBackground:(BOOL)flag;
@end

首先,我认为setClearsBackground方法正在添加QCView类定义。但是当我搜索这个实现文件时,我发现没有setClearsBackground方法的实现(虽然这个消息被发送到文件中几个地方的QCView实例)。

为什么有人会在像QCView这样的框架类上声明一个方法但是却没有在任何地方实现该方法?我唯一的猜测是,这是绕过编译器并调用未在QCView.h文件中声明的方法的一种方法。但这似乎不太可能,因为开发人员如何知道这种方法的实现甚至存在?

1 个答案:

答案 0 :(得分:6)

开发人员可能使用class-dump之类的工具来生成标题,列出框架实现的所有方法。如果您需要访问SPI并且没有其他选择,这将非常有用。如果没有声明,Objective-C会对方法参数进行假设,除了生成警告之外,还可能会生成不正确的方法调用。

有关未来操作系统修订版中未记录的界面的所有常见警告均适用。至少,您应该检查对象是否响应该方法(-[NSObject respondsToSelector])。对于额外的偏执,您可以将调用包装在异常块中,以防方法保留但其行为已更改。