2011-05-17 56 views
1

我已經按類別向引擎中的現有類添加了一些方法。這個類別是在我單獨的文件中聲明和實現的。然後我包含這些文件(但所有引擎文件保持不變,因此只有原始聲明包含在引擎中)。引擎被構建到靜態庫中並與我的應用程序鏈接。當我調用我的類別的方法時,應用程序崩潰,出現錯誤「無法識別的選擇器發送到實例...」。但如果我用原始引擎類聲明文件類別的所有作品。在單獨的文件中闡明Objective-C類別

爲什麼類別的選擇器如果在單獨的文件中聲明和實現,則無法識別?包含文件的順序是否重要?

+0

你是如何申報這個類別的?你可以添加一些代碼,以便我們看到你已經正確地聲明瞭它嗎? – Abizern 2011-05-17 11:19:30

回答

3

這是一個鏈接器錯誤,其中在自己的編譯單元中聲明的類別方法未正確鏈接到應用程序中。從這裏蘋果參見技術說明:

Building Objective-C static libraries with categories

必須要麼在應用程序中指定鏈接標誌-all_load,或「哈克」的方法是定義一個宏將定義一個虛擬的類和實施,並呼籲在每個類別中實現宏觀:

#define FIX_CATEGORY_LINKER_BUG(name) \ 
    @interface FIX_CATEGORY_LINKER_BUG_##name @end \ 
    @implementation FIX_CATEGORY_LINKER_BUG_##name @end 

和上面的類別執行如下命令使用它:

FIX_CATEGORY_LINKER_BUG(NSStringMyAdditions) 

@implementation NSString (MyAdditions) 
// ...