我正在尝试做一个静态库,它使用 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 返回。