我正在尝试使用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'的超类”。 据我所知,前向类声明只是说“嘿编译器类xXX存在,但你看不到它的方法和属性”。因此,我不确定这是否是我的问题的解决方案。
有关如何从类中继承但不导入它的任何建议吗?
答案 0 :(得分:3)
您不能对其标头不可用的类进行子类化。您可以做的最好的事情是使您的AFHTTPSessionManager的子类成为私有,而是公开一个类(NSObject的子类,比如说)作为外观,将消息转发给您的私有类。
您还可以使用协议作为类的接口,并公开一个返回id<MyClassProtocol>
的方法。类似的东西:
@protocol MyClassProtocol
- (void) doMagic;
@end
id<MyClassProtocol> GetSharedInstance();
然后有一个这样的类,它不会从你的库中暴露出来:
@interface MyClass<MyClassProtocol>: AFHTTPSessionManager
// ...
@end
您可以实例化并从GetSharedInstance返回。
答案 1 :(得分:0)
你应该在这里导入这个类,而不是向前声明它。任何使用您的子类的类都应该可以访问超类的所有公共方法和变量部分,而不必手动导入它。您提到的第一个错误显示您的类未包含在目标中,或者您输入错误。
你是如何包括AFNetworking
的?你在使用cocoapods吗?
如果是这样,请尝试以这种方式导入。
#import <AFNetworking.h>
否则,请使用Xcode右侧的File Inspector Panel确保AFNetworking.h
实际上是构建目标的一部分。