【问题标题】:Why declare a method in a Category without implementing it?为什么在 Category 中声明一个方法而不实现它?
【发布时间】:2009-04-07 12:22:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

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

    所有关于未记录接口在未来操作系统版本中中断的常见警告都适用。至少,您应该检查对象是否响应该方法 (-[NSObject respondsToSelector])。对于额外的偏执,您可以将调用包装在异常块中,以防方法保留但其行为发生变化。

    【讨论】:

    • 系统编程接口。本质上,任何(技术上)没有明确记录或支持的外部可访问函数或方法。
    • 很棒的答案,谢谢。我下载了 class-dump 并在 QuartzComposer.framework 上运行它,上面的方法确实出现在输出中,所以我认为可以肯定地说这正是作者所做的。再次感谢。
    猜你喜欢
    • 2012-09-22
    • 2019-09-16
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2012-03-01
    • 2012-10-05
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多