@class

2010-08-07 64 views
12

「無法找到接口聲明錯誤...」我遇到了似乎對我沒有任何意義的Objective-C問題。我是一位相對熟練的ObjC程序員,理解整個「前向聲明」的概念,但是這個讓我撓頭。所以這裏的交易:@class

ClassA是我的Xcode項目中的一個類,只是項目。 ClassB是ClassA的一個子類,它是公共的,並被導入到我的框架頭中。

我得到「無法找到'ClassA'的接口聲明,'ClassB'的超類...」錯誤時,建設。我已經將@class ClassA;前向聲明放在ClassB.h中,但這似乎不能解決問題。當我將@class ClassA;更改爲#import ClassA.h時,它工作正常。但是,由於ClassA僅用於項目,因此依賴項目無法構建ClassB,因爲它無法訪問ClassA的源。

任何幫助將不勝感激,我希望這是有道理的。謝謝!

回答

10

要爲類繼承,超類的完整聲明必須可供編譯器使用。 @class只是啓用對所述類的實例的引用 - 允許使用A *foo;

子類化需要更多的元數據(至少,它沒有在傳統運行時 - 我認爲有可能支持不完整的超類的子類@interface技術上是可行的,但可能不會有用。)

+0

嗯,我想盡可能多。但是,這使我不確定在這裏做什麼。我想我留下的唯一路線是公開超類,並簡單地記錄說不建議使用超類。 – Grimless 2010-08-07 19:56:30

+1

啊,是的。抽象的超類。我建議你閱讀關於Class Clusters的內容,因爲它們會延續類似的設計模式。 – bbum 2010-08-07 20:51:41

+0

不幸的是,我不相信類集羣解決這個問題。類集羣隱藏提供特定功能的子類。我試圖隱藏*超類*,同時仍然公開可用的子類。無論如何,謝謝你的洞察力! – Grimless 2010-08-08 00:17:36

37

問題是你在#imports中有一個無限循環。 解決方案:所有#imports進入實現文件,所有需要的類都在.h文件中聲明。

1

我有一個問題,我在超類方法中使用類別,並得到這個繼承錯誤。一旦我將類別.h導入到超類.m文件中,事情開始變得越來越好。

6

我有一個答案:你必須檢查你的#import命令。在使用超類之前,應該導入並編譯它。

1

只需執行超類的.h文件到.m文件的所有可能的標題,並查看哪一個是問題的問題。我確定這是兩個類中使用的常見標題之一。

0

像@Igor說,進口事項的順序:

我不得不改變

#import <KeychainItemWrapper/KeychainItemWrapper.h> 
#import <Foundation/Foundation.h> 

#import <Foundation/Foundation.h> 
#import <KeychainItemWrapper/KeychainItemWrapper.h>