【问题标题】:Forward class as super class转发类作为超类
【发布时间】:2014-09-16 13:30:03
【问题描述】:

我正在尝试做一个使用 AFNetworking 的静态库。我只想使用 .a 和 .h 文件分发库。

但是,我在库中的一个类是AFHTTPSessionManager 的子类。所以我之前的 .h 文件是这样的:

#import <Foundation/Foundation.h>
#import "AFNetworking.h"

@interface MyClass : AFHTTPSessionManager

+ (MyClass *) sharedInstance;

- (void) doMagic;

@end

当我编译库并将 .a 和 .h 文件导入新的测试项目时,我收到一个错误“找不到词法或预处理器问题 'AFNetworking.h' 文件”。认为解决方案是使用前向类声明并将#import“AFNetworking.h”移动到.m文件,如下所示:

#import <Foundation/Foundation.h>

@class AFHTTPSessionManager;

@interface MyClass : AFHTTPSessionManager

+ (MyClass *) sharedInstance;

- (void) doMagic;

@end

不幸的是,这种方法会引发错误“尝试使用前向类 'AFHTTPSessionManager' 作为 'MyClass' 的超类”。 据我了解,您使用前向类声明只是为了说“嘿,编译器 classXXX 存在,但您看不到它的方法和属性”。因此,我不确定这是否可以解决我的问题。

有什么建议可以从一个类继承而不是导入它吗?

【问题讨论】:

    标签: ios objective-c forward-declaration


    【解决方案1】:

    您不能对标头不可用的类进行子类化。您可以做的最好的事情是使您的 AFHTTPSessionManager 子类私有,而是公开一个充当外观的类(例如 NSObject 的子类),将消息转发到您的私有类。

    您也可以使用协议作为您的类的接口,并且只公开一个返回id&lt;MyClassProtocol&gt; 的方法。比如:

    @protocol MyClassProtocol
    - (void) doMagic;
    @end
    
    id<MyClassProtocol> GetSharedInstance();
    

    然后有一个这样的类,它不会从您的库中公开:

    @interface MyClass<MyClassProtocol>: AFHTTPSessionManager
    // ...
    @end
    

    您可以实例化并从 GetSharedInstance 返回。

    【讨论】:

    • 当然,实际上你应该在 AFHTTPSessionManager 前面加上你自己的名字,这样它就不会与你的库的用户发生冲突,因为他们可能想要使用该库的不同版本;在这种情况下,您也可以发送带前缀的 AFNetworking 标头。
    【解决方案2】:

    您应该在此处导入类,而不是转发声明它。任何使用您的子类的类也应该可以访问超类的所有公共方法和变量部分,而不必手动导入它。您提到的第一个错误表明您的类未包含在目标中,或者您可能导入错误。

    您如何包括AFNetworking。你在用cocoapods吗? 如果是这样,请尝试以这种方式导入。

    #import <AFNetworking.h>
    

    否则,请使用 Xcode 右侧的文件检查器面板确保 AFNetworking.h 实际上是构建目标的一部分。

    【讨论】:

    • 没错,我使用 CocoaPods 将 AFNetworking 包含到我的库项目中。我尝试使用 导入,但没有帮助。查看文件检查器的屏幕截图 (ppdevelopment.cz/fileinspector.png)
    • 是的,一切看起来都很好。我不确定在这种情况下出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2017-08-03
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2020-06-07
    相关资源
    最近更新 更多