2011-09-19 79 views

回答

31

類別是在運行時添加到類中的方法的集合。由於Objective-C使用動態綁定,這意味着類中定義的方法對類及其所有子類都可用。具體而言,選擇器在被調用的地方綁定到方法,而不是在編譯期間或程序第一次加載時。當類(類別)加載時,類將被添加到類中。

協議定義符合它們的類承諾實現的方法簽名的集合。一旦一個類聲明它符合一個協議,就好像這個類的接口中聲明的方法一樣,並且繼承規則完全相同:子類繼承協議方法的聲明和實現,但也可以選擇覆蓋超類實現。

協議本身可以擴展到產生新的協議。由原始協議中方法的超集組成。事實上,正如大多數類繼承NSObject類一樣,大多數協議都會擴展NSObject協議(協議名稱和類名稱位於不同的名稱空間中)。這樣可以發送聲明爲id<WhateverProtocol>的對象可以發送像-retain,-release等基本消息,而不會產生編譯器警告。

+1

提及'obj-C'運行時間爲+1 –

+1

最受歡迎的示例應該是: @protocol UITableViewDelegate 。 –

6

類別就像一個類的擴展。您可以將自己的方法添加到其他類(如NSString或其他任何類)。這意味着任何子類都可以獲得這些方法。

協議是一個方法列表,它要求類確認它實現所有的方法(除非它使用@optional標籤)。所以繼承它的子類是毫無意義的。

編輯:

用於協議實現,我意識到,我並不清楚。 Protocol在其超類中實現的方法可以被繼承,但是,我的意思是通常你不需要重寫你的超類的協議方法。

+3

更具體地說:一子類繼承了其父代的協議一致性。所以如果一個類符合,那麼它的子類也符合。 –

+0

是的,這就是我所說的。謝謝。 – TheAmateurProgrammer

4

你的問題不清楚。您可能會問,子類是否繼承其超類的協議和類別。 @theAmateurProgrammer已經回答了這個問題。

您可能還在問是否類別和協議本身可以繼承其他類別和協議。對於類別,答案是否定的。對於協議,答案是肯定的,而事實上的協議應該總是繼承只是喜歡這樣的類:

@protocol SomeProtocol <NSObject> 
... 
@end 

這就是說任何一個符合<SomeProtocol>也符合<NSObject>(這是一個協議,以及一個類)。這允許您調用respondsToSelector:等方法,這對大多數協議實現都非常重要。

+0

這個答案的一半是對原始問題的評論。另一方面,它今天回答了我的問題,所以+1。謝謝。 –

2

協議就像Java中的接口。所以,一個類提供了一個訪問它的協議。

就像在Java中一樣,你可以「子類」化你的接口。

另一方面,類別是向類中添加更多方法的一種方法。限制是你不能添加任何具有類別的實例變量。您只能訪問現有的實例變量。

這是非常有用的,但它避免了創建一個大的脆弱的子類層次結構。

所以,底線是,如果你想要一個視圖不同的類符合標準接口,然後使用一個協議。如果你想添加一些方法到現有的類而沒有子類的麻煩,去一個類別。

然而,有一點需要記住的是,當您將方法添加到某個類別時 - 我已經被同事提醒 - 這就是您在任何地方都可以使用這些方法。我已經在幾個地方讀到,一個常見的新手錯誤是對類別瘋狂,始終使用它們,而不是創建可以完成這項工作的新類。因此,如果您正在考慮的新類別方法真的是特定的或者與業務功能緊密耦合的,那麼它可能不應該是一個類別。他們真的只能用於基類的通用添加。

1

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"); 
}