2012-05-19 62 views
1

如果我使用額外方法定義NSObject協議的子協議,然後定義並實現一個聲明與該協議一致的NSObject類別,我會在編譯時收到警告。編譯器抱怨我的NSObject類別沒有實現在NSObject協議中聲明的所有方法。NSObject實現協議上的類別導致未實現方法警告

我不明白爲什麼會出現這種情況。該NSObject類(在<Foundation/NSObject.h>宣佈,它符合NSObject協議(以及冗餘,它實現了這些方法) - ?不應該是足夠

有什麼問題的原因在這裏

示例代碼? - 如果你編譯這個,你會看到在NSObject (CategoryToImplementMyProtocol)實施警告:

@protocol MyProtocol <NSObject> 
- (void)myMethod; 
@end 

@interface NSObject (CategoryToImplementMyProtocol) <MyProtocol> 
@end 

@implementation NSObject (CategoryToImplementMyProtocol) 

- (void)myMethod 
{ 
    NSLog("A la peanut butter sandwiches!"); 
} 

@end 

我發現一對夫婦的解決這一問題,但所有的答案都的「做到這一點的解決辦法!」品種,而不是「這是問題的原因「多種(或者只是儘管被接受...)。我知道我可以解決這個問題。我真的很想知道爲什麼它失敗。

回答

1

問題是您再次宣佈採用<NSObject>協議。協議在Objective-C中的工作方式(更好或更糟糕)是類別實現必須實現在其接口​​中指定的所有協議。

另外,在Objective-C中,協議一致性是名義上的而不是結構性的。也就是說,一個班級對正確的方法做出反應並不足以使其採用該協議。

編輯:似乎示例代碼已經改變了,我想我的答案是不是真的有關了。

+1

對不起!轉錄代碼時是錯誤的(如果它是任何安慰,我在看到你的答案之前編輯了問題 - 儘管我認爲它仍然有意義,不是嗎?因爲'MyProtocol'是'NSObject'的子協議。 –

+0

:)但我認爲這種情況(我甚至沒有意識到會發生)稍微比我回答的更令人困惑。由於在繼承「」的類上實現這樣的類別時沒有這樣的問題,但不要自己採用它。 –

+0

是的,我仍然沒有完全看到問題 - 爲什麼僅僅添加我的類的主要'NSObject'類已經聲明符合'NSObject'協議? –