将类作为超类向前传递

4

我正在尝试创建一个静态库,其中使用了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

不幸的是,这种方法会抛出一个错误"Attempting to use forward class 'AFHTTPSessionManager' as superclass of 'MyClass'"。就我所了解的前向类声明,你只是用它来表示"嘿编译器,classXXX存在,但你看不到它的方法和属性"。因此,我不确定这是否是我的问题的解决方案。

有什么建议可以从一个类派生子类,但不导入它?

2个回答

3
您不能对头文件不可用的类进行子类化。最好的做法是将您的AFHTTPSessionManager子类设置为私有,并公开一个类(比如NSObject的子类),该类作为一个门面,将消息转发给您的私有类。
您还可以使用协议作为您的类的接口,并公开一个返回id<MyClassProtocol>的方法。类似于以下代码:
@protocol MyClassProtocol
- (void) doMagic;
@end

id<MyClassProtocol> GetSharedInstance();

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

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

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


当然,真正的做法是在AFHTTPSessionManager之前加上您自己的名称,以免与使用不同版本该库的用户发生冲突;在这种情况下,您也可以同时发布带有前缀的AFNetworking头文件。 - Jesse Rusak

0

你应该在这里导入类,而不是前向声明它。任何使用你的子类的类也应该能够访问超类的所有公共方法和变量,而无需手动导入它。你提到的第一个错误表明,你的类可能没有包含在目标中,或者你导入它的方式有误。

你是如何包含 AFNetworking 的?你使用的是cocoapods吗? 如果是这样,请尝试以这种方式导入它。

#import <AFNetworking.h>

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

我使用CocoaPods将AFNetworking包含到我的库项目中。我尝试使用< >导入,但没有帮助。请参见文件检查器的截图(http://ppdevelopment.cz/fileinspector.png)。 - pprochazka72
是的,所有看起来都没问题。我不确定这种情况出了什么问题。 - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接