我正在阅读开源项目的源代码,我在实现文件中遇到了以下类别定义:
@interface QCView (Private)
- (void)_pause;
- (void)setClearsBackground:(BOOL)flag;
@end
首先,我认为setClearsBackground
方法正在添加到QCView
类定义。但是当我搜索这个实现文件时,我发现没有setClearsBackground
方法的实现(虽然这个消息被发送到文件中几个地方的QCView
实例)。
为什么有人会在像QCView
这样的框架类上声明一个方法但是却没有在任何地方实现该方法?我唯一的猜测是,这是绕过编译器并调用未在QCView.h
文件中声明的方法的一种方法。但这似乎不太可能,因为开发人员如何知道这种方法的实现甚至存在?
答案 0 :(得分:6)
开发人员可能使用class-dump之类的工具来生成标题,列出框架实现的所有方法。如果您需要访问SPI并且没有其他选择,这将非常有用。如果没有声明,Objective-C会对方法参数进行假设,除了生成警告之外,还可能会生成不正确的方法调用。
有关未来操作系统修订版中未记录的界面的所有常见警告均适用。至少,您应该检查对象是否响应该方法(-[NSObject respondsToSelector]
)。对于额外的偏执,您可以将调用包装在异常块中,以防方法保留但其行为已更改。