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

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

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

@interface MyClass : AFHTTPSessionManager

+ (MyClass *) sharedInstance;

- (void) doMagic;

@end

当我编译库并将 .a 和 .h 文件导入新的测试项目时,我收到错误 "Lexical or Preprocessor Issue 'AFNetworking.h' file not found" 。认为解决方案是使用前向类声明并将 #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 存在,但您看不到它的方法和属性”。因此,我不确定这是否是我问题的解决方案。

任何建议如何从一个类中子类化但不导入它?

最佳答案

您不能对标题不可用的类进行子类化。你能做的最好的事情是让你的 AFHTTPSessionManager 子类私有(private),而不是公开一个类(比如 NSObject 的子类),它充当一个门面,将消息转发到你的私有(private)类。

您还可以使用协议(protocol)作为类的接口(interface),并只公开一个返回 id<MyClassProtocol> 的方法。就像是:

@protocol MyClassProtocol
- (void) doMagic;
@end

id<MyClassProtocol> GetSharedInstance();

然后有一个这样的类,它没有从你的库中公开:
@interface MyClass<MyClassProtocol>: AFHTTPSessionManager
// ...
@end

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

10-07 16:37