2014-07-24 36 views
4

我想做一個靜態庫,它使用AFNetworking。我只想用.a和.h文件分發這個庫。轉發類作爲超類

然而,庫中的其中一個類是AFHTTPSessionManager一個子類。所以我以前的.h文件中是這樣的:

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

@interface MyClass : AFHTTPSessionManager 

+ (MyClass *) sharedInstance; 

- (void) doMagic; 

@end 

當我編譯庫和進口的u和.h文件到一個新的測試項目中,我得到了一個錯誤「詞彙或預處理問題「AFNetworking.h '找不到文件'。認爲解決辦法是使用正班宣言和移動#進口「AFNetworking.h」的.m文件是這樣的:

#import <Foundation/Foundation.h> 

@class AFHTTPSessionManager; 

@interface MyClass : AFHTTPSessionManager 

+ (MyClass *) sharedInstance; 

- (void) doMagic; 

@end 

不幸的是,這種方法會引發錯誤「試圖使用正向類'AFHTTPSessionManager'作爲'MyClass'的超類'「。 據我瞭解,你用它正向類的聲明只是說「哎編譯classXXX存在,但你不能看到它的方法和屬性」。因此,我不確定這是否是解決我的問題的方法。

任何建議如何從一個類繼承,但不是進口嗎?

回答

3

您不能繼承其頭不可用的類。你可以做的最好的做法是讓你的AFHTTPSessionManager的子類是私有的,而是暴露一個充當外觀的類(NSObject的子類,比如說),將消息轉發給你的私有類。

您還可以使用的協議爲你的類接口,只是暴露其返回id<MyClassProtocol>的方法。喜歡的東西:

@protocol MyClassProtocol 
- (void) doMagic; 
@end 

id<MyClassProtocol> GetSharedInstance(); 

再有一個像這樣沒有從庫中暴露的一類:

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

,你可以實例,並從GetSharedInstance返回。

+0

當然,你真的應該在自己的名字前面加上AFHTTPSessionManager的前綴,這樣它就不會與你的庫的用戶衝突,因爲它可能想使用該庫的不同版本;在這種情況下,您可以將您的前綴AFNetworking標題也發送出去。 –

0

你應該在這裏導入類,而不是向前宣佈它。任何使用你的子類的類都應該有權訪問超類的所有公共方法和變量部分,而不必手動導入它。你提到的第一個錯誤表明,你的類沒有包含在目標中,或者你錯誤地導入了它。

你怎麼包括AFNetworking。你在使用椰子樹嗎? 如果是這樣,請嘗試以這種方式導入它。

#import <AFNetworking.h> 

否則,確保AFNetworking.h實際上是使用上的Xcode右側的文件檢查器面板中您的構建目標的一部分。

+0

準確地說,我使用CocoaPods將AFNetworking包含到我的庫項目中。我試圖用< >導入,但它沒有幫助。查看截圖(http://ppdevelopment.cz/fileinspector.png)的文件檢查器 – pprochazka72

+0

是啊,一切都很好。我不確定在這種情況下有什麼問題。 – Dima