我已經按類別向引擎中的現有類添加了一些方法。這個類別是在我單獨的文件中聲明和實現的。然後我包含這些文件(但所有引擎文件保持不變,因此只有原始聲明包含在引擎中)。引擎被構建到靜態庫中並與我的應用程序鏈接。當我調用我的類別的方法時,應用程序崩潰,出現錯誤「無法識別的選擇器發送到實例...」。但如果我用原始引擎類聲明文件類別的所有作品。在單獨的文件中闡明Objective-C類別
爲什麼類別的選擇器如果在單獨的文件中聲明和實現,則無法識別?包含文件的順序是否重要?
我已經按類別向引擎中的現有類添加了一些方法。這個類別是在我單獨的文件中聲明和實現的。然後我包含這些文件(但所有引擎文件保持不變,因此只有原始聲明包含在引擎中)。引擎被構建到靜態庫中並與我的應用程序鏈接。當我調用我的類別的方法時,應用程序崩潰,出現錯誤「無法識別的選擇器發送到實例...」。但如果我用原始引擎類聲明文件類別的所有作品。在單獨的文件中闡明Objective-C類別
爲什麼類別的選擇器如果在單獨的文件中聲明和實現,則無法識別?包含文件的順序是否重要?
這是一個鏈接器錯誤,其中在自己的編譯單元中聲明的類別方法未正確鏈接到應用程序中。從這裏蘋果參見技術說明:
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)
// ...
您需要爲鏈接器設置一些標誌...詳情請參閱What does the -all_load linker flag do?。
你是如何申報這個類別的?你可以添加一些代碼,以便我們看到你已經正確地聲明瞭它嗎? – Abizern 2011-05-17 11:19:30