2010-04-17 195 views
0

這不是一個真正的Xcode錯誤消息,它是一個長期困擾我的 的警告。我發現沒有辦法去除它,我想我可能已經超越了一些不成文的命名約定規則。關於「initWithDelegate」的持續警告消息!

如果我建立一個類,最常見的是擴展NSObject,它的唯一目的是做一些任務,當它有數據時報告回來,我經常給它一個像「initWithDelegate」這樣的方便構造器。

第一次我在當前的項目做,這是一個名爲ISWebservice類有這樣的協議:

@protocol ISWebserviceDelegate 

@optional 

- (void) serviceFailed:(NSError*) error; 
- (void) serviceSuccess:(NSArray*) data; 

@required 

@end 

在我ISWebservice.h接口中聲明,右下方我的import語句。

我有其他的類,使用一個名爲「initWithDelegate」的便利構造函數。 例如「InternetConnectionLost.h」中,這個類沒有可選的方法,聲明中沒有@optional @required標籤,即它們都是必需的。

現在我的每一次實例化這些類的時候都會彈出一個使用晚於ISWebservice的便捷構造函數的類,所以當使用「InternetConnectionLost」類時,即使擁有「InternetConnectionLost」對象的整個類沒有任何關係與「ISWebservice」級,沒有進口,被調用的方法,什麼都沒有,警告雲:「ClassOwningInternetConnectionLost」不落實「ISWebserviceDelegate」協議

我在運行時不破壞任何東西,崩潰或幫我任何傷害,但在我接近發佈時,它已經開始困擾我。另外,因爲有幾個類使用「initWithDelegate」構造函數命名,所以在構建結果中我有18個這樣的警告,如果我做錯了什麼,在這種語言中是相當新的,我不確定。

希望有人能在此警告棚一盞小燈,謝謝:)

回答

0

你得到,因爲編譯器認爲該課程已經宣佈他們實施ISWebserviceDelegate協議的警告。我懷疑它與intiWithDelegate方法有什麼關係,除非你繼承了這個方法,或者你已經在一個本身是協議的擴展的協議中定義了這個方法。

通常的原因是在超類中聲明協議的採用,然後忘記在隨後的子類的超類中實現。

如果您確定不是這種情況,那麼您可能只需要清理該項目並重建。你很可能在某個時候聲明瞭,然後未聲明,但編譯器停留在舊聲明上。

如果幹淨不解決,我會做一個項目找到ISWebserviceDelegate並確保它沒有捲起某處。

+0

嗨TechZen。 感謝您的建議,他們都很好,我經歷了他們,但仍然沒有運氣。 警告已經發生了一個多月的發展,在那段時間內已經完​​成了許多「清理所有目標」。 我確信那裏有與實施ISWebserviceDelegate和所有的人要麼延長NSObject的,或者的UIViewController UIView的警告沒有課。 – RickiG 2010-04-17 14:02:27

+0

那麼,唯一剩下的就是一個類別,可能是NSObject。可以在自定義構建腳本或其他東西。我只在這個項目上做到這一點?如果沒有,那麼你可能在某處有一個損壞的Xcode首選項 – TechZen 2010-04-17 20:39:13

+0

你可能讓別人查看你的代碼。當我們每天都在盯着它時,一組新的眼睛往往會看到我們不會看到的東西。 – TechZen 2010-04-17 20:40:08

4

這裏的原因是您的項目中有多個接口,它們的函數定義爲initWithDelegate:(id)。

Alloc只返回id,因此編譯器不知道類型,因此它不知道正在使用哪個initWithDelegate,並且看起來使用列表中的第一個。因此,你會得到一個毫無意義的警告。

運行時知道對象的類型,但是,因此不會有任何麻煩。

溶液似乎是使用更詳細的初始化方法,例如。 initWithWebServiceDelegate。或到頁頭之後投:

[(Foo *)[Foo alloc] initWithDelegate:self] 
+1

不幸的是,在可可導致的約定:' - (ID)initWithDelegate'和'+(ID)webServiceWithDelegate'因爲後者並不需要儘可能的編譯器來講和以前做的命名空間。 – mxcl 2010-12-06 11:26:29