2009-07-08 44 views
2

我從外部庫擴展一個類。這裏是我的代碼:Objective-C類別導入奇怪行爲

頭文件管理器+ MyCategory.h

#import "Manager.h" 
#import "Element.h" 

@interface Manager (myCategory) 
- (Element*) elementWithTag:(NSInteger)tag; 
@end 

實現文件:經理+ MyCategory.h文件

@implementation Manager (myCategory) 

- (Element*) elementWithTag:(NSInteger)tag { 
    ... 
} 

@end 

現在這裏是我如何使用這個類別:

#import "Manager+MyCategory.h" 

@implementation myClass 

- (void) myFunction:(NSInteger)tag { 
    Manager* myManager = [[Manager alloc] init]; 
    Element* = [myManager elementWithTag:tag]; 

    ... 

    [myManager release]; 
} 

@end 

當我編譯我沒有警告,但是當我運行我的程序時,我得到以下錯誤:

*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]: 

正確導入頭文件(即Manager + MyCategory.h),但看起來好像與實現文件的鏈接沒有完成。 如果我通過#import「Manager + MyCategory **。m **」替換#import「Manager + MyCategory **。h **」,它可以正常工作。

任何人都可以解釋我忘了什麼?由於

回答

1

分類不符合傳統的Unix 靜態庫很好地工作。

如果這是你的情況,似乎傳遞-ObjC選項給連接器解決此問題。

Apple Technical Q&A QA1490解釋了這一切。

4

我懷疑你忘了經理+ MyCategory.m添加到approrpriate目標在Xcode。您不會收到鏈接器錯誤,因爲所有符號都存在,並且沒有編譯器警告,因爲您已包含適當的頭文件,但在運行時缺少elementWithTag:方法的實現。

+0

好點!但是我檢查並且Manager + MyCategory.m在目標編譯源中很好。 Thx無論如何 – Thomas 2009-07-08 18:57:31

+1

另一個健康檢查從未受傷。嘗試在你的Manager + MyCategory.m中拋出一個#error。如果編譯器沒有失敗,你肯定知道你的類沒有被編譯。 – kperryua 2009-07-08 19:21:02

+0

對不起,我無法幫助。我會在這裏留下答案,因爲它可能會在未來幫助其他人。祝你好運。 – 2009-07-08 19:36:41

0

道歉,不能添加爲評論...

只是用於測試,您可能要添加的頭部聲明,並在.m文件中實現一個外部的C函數。如果您在測試代碼中調用此c函數,則由於未解析的標識符,此生成鏈接器錯誤。

這可以更容易地調查這個問題,因爲它提供即時反饋,並可能產生一些額外的線索,爲什麼沒有被包含的文件。

由於時間框架,我假設你已經這樣做了,但以防萬一...請確保您已清理目標,關閉的XCode,然後重新打開。我曾經讓項目文件在內存中被破壞,並且奇怪地行事。

巴尼

0

我升級到的Xcode 4

時要解決我有我的類別定義分隔成一個單獨的.m和.H有這個問題 - Xcode的3似乎好與實現和接口中存在。小時...但哦,不挑剔Xcode 4是相當肛門。