回答
類別是在運行時添加到類中的方法的集合。由於Objective-C使用動態綁定,這意味着類中定義的方法對類及其所有子類都可用。具體而言,選擇器在被調用的地方綁定到方法,而不是在編譯期間或程序第一次加載時。當類(類別)加載時,類將被添加到類中。
協議定義符合它們的類承諾實現的方法簽名的集合。一旦一個類聲明它符合一個協議,就好像這個類的接口中聲明的方法一樣,並且繼承規則完全相同:子類繼承協議方法的聲明和實現,但也可以選擇覆蓋超類實現。
協議本身可以擴展到產生新的協議。由原始協議中方法的超集組成。事實上,正如大多數類繼承NSObject
類一樣,大多數協議都會擴展NSObject
協議(協議名稱和類名稱位於不同的名稱空間中)。這樣可以發送聲明爲id<WhateverProtocol>
的對象可以發送像-retain
,-release
等基本消息,而不會產生編譯器警告。
類別就像一個類的擴展。您可以將自己的方法添加到其他類(如NSString或其他任何類)。這意味着任何子類都可以獲得這些方法。
協議是一個方法列表,它要求類確認它實現所有的方法(除非它使用@optional標籤)。所以繼承它的子類是毫無意義的。
編輯:
用於協議實現,我意識到,我並不清楚。 Protocol在其超類中實現的方法可以被繼承,但是,我的意思是通常你不需要重寫你的超類的協議方法。
更具體地說:一子類繼承了其父代的協議一致性。所以如果一個類符合
是的,這就是我所說的。謝謝。 – TheAmateurProgrammer
你的問題不清楚。您可能會問,子類是否繼承其超類的協議和類別。 @theAmateurProgrammer已經回答了這個問題。
您可能還在問是否類別和協議本身可以繼承其他類別和協議。對於類別,答案是否定的。對於協議,答案是肯定的,而事實上的協議應該總是繼承只是喜歡這樣的類:
@protocol SomeProtocol <NSObject>
...
@end
這就是說任何一個符合<SomeProtocol>
也符合<NSObject>
(這是一個協議,以及一個類)。這允許您調用respondsToSelector:
等方法,這對大多數協議實現都非常重要。
這個答案的一半是對原始問題的評論。另一方面,它今天回答了我的問題,所以+1。謝謝。 –
協議就像Java中的接口。所以,一個類提供了一個訪問它的協議。
就像在Java中一樣,你可以「子類」化你的接口。
另一方面,類別是向類中添加更多方法的一種方法。限制是你不能添加任何具有類別的實例變量。您只能訪問現有的實例變量。
這是非常有用的,但它避免了創建一個大的脆弱的子類層次結構。
所以,底線是,如果你想要一個視圖不同的類符合標準接口,然後使用一個協議。如果你想添加一些方法到現有的類而沒有子類的麻煩,去一個類別。
然而,有一點需要記住的是,當您將方法添加到某個類別時 - 我已經被同事提醒 - 這就是您在任何地方都可以使用這些方法。我已經在幾個地方讀到,一個常見的新手錯誤是對類別瘋狂,始終使用它們,而不是創建可以完成這項工作的新類。因此,如果您正在考慮的新類別方法真的是特定的或者與業務功能緊密耦合的,那麼它可能不應該是一個類別。他們真的只能用於基類的通用添加。
NSObject的符合NSObject的協議
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
假設我們有NSObject的子類
@interface FTGAnimal : NSObject
@end
@implementation FTGAnimal
@end
我們可以看到,FTGAnimal實際上符合NSObject的協議
if ([FTGAnimal conformsToProtocol:@protocol(NSObject)]) {
NSLog(@"FTGAnimal conforms to NSObject protocol");
}
- 1. 是否可以繼承UiApplicationDelegate協議?
- 2. 類和協議繼承斯威夫特
- 3. 您可以擴展從另一個協議繼承的協議嗎?
- 4. 協議在Objective-C中是可以繼承的嗎?
- 5. 類可以從System.Web.UI.Page和System.Web.UI.UserControl繼承嗎?
- 6. 繼承的類Vs的協議
- 7. iOS繼承一個協議類
- 8. 協議方法的繼承
- 9. 協議繼承在swift中
- 10. 繼承協議的URL
- 11. 繼承通用協議
- 12. 使用Swift協議繼承
- 13. 協議的實施和繼承
- 14. 斯威夫特協議繼承和協議一致性問題
- 15. 類可以從「參數」類繼承嗎? (有條件繼承)
- 16. 一個類別可以在Objective C中實現協議嗎?
- 17. apache httpcomponent和sftp協議 - 協議可以使用嗎?
- 18. python元類可以繼承嗎?
- 19. 可以寫R.class。(一個繼承類)嗎?
- 20. python單例類可以被繼承嗎?
- 21. MultiLevel繼承,C類可以繼承Class A嗎?
- 22. 繼承和協會
- 23. 夫特相關類型和協議繼承
- 24. 可以繼承python @classmethod嗎?
- 25. YAML可以繼承嗎?
- 26. JFlex中可以繼承嗎?
- 27. 可以csharp類「繼承」像java類的XML文檔可以嗎?
- 28. 限制從協議繼承的協議泛型參數
- 29. Objective-C協議vs繼承與擴展?
- 30. 斯威夫特協議繼承
提及'obj-C'運行時間爲+1 –
最受歡迎的示例應該是: @protocol UITableViewDelegate。 –