2011-01-14 39 views
5

我正在研究一些關於非正式協議和真實協議的基礎知識。令我困惑的是,Cocoa似乎在NSObject上使用了很多非正式的協議。這些非正式協議是NSObject的類別,它聲明方法,但實際上並沒有實現它們。在NSObject上使用非正式協議或使用可選方法的協議有什麼區別?

據我所知,他們使用非正式協議(換句話說,NSObject上沒有提供方法實現的類別)的唯一原因是在Xcode中給出一個自動完成提示。

一個示例是NSNibLoading.h中定義的-awakeFromNib方法,NSNibLoading.h是NSObject上的非正式協議。筆尖加載系統在運行時檢查對象是否實現該方法。如果是這樣,那麼它會調用它。

但現在讓我們想象一下,沒有任何功能稱爲非正式協議。另一種具有完全相同效果的替代方案將是一個真正的@protocol聲明,它聲明瞭一個可選方法-awakeFromNib。 NSObject只會採用該協議,編譯器會愉快地提供自動完成。

任何人都可以指出這兩種策略之間的巨大差異嗎?我沒有看到非正式協議的重點,但真的很想這樣做。

回答

7

兩個巨大的差異:

  1. 編譯時類型檢查。使用可選方法的顯式協議更清楚您可以實現哪些方法。無論是用它所符合的協議明確裝飾類,Xcode都可以提供更精確的代碼完成列表,包括您可以實現的內容。

  2. 它保持NSObject整潔。使用舊式非正式協議,所有可選的方法通常都會將默認實現添加到NSObject

自從Objective-C 2.0中的協議中引入可選方法以來,不再存在的問題的整潔解決方案的非正式協議。

1

爲了使用一個協議,你必須導入它,並讓你的編碼對象符合它

TestViewController : UIViewController <MyAwesomeProtocol> 

爲了要使用的類別,你不必做這樣的事情,你可以簡單地導入類(甚至在所有情況下都不需要)並使用對象(在我的情況下是一個UIViewController),就像你經常會這樣,XCode會爲你提供類的方法的自動完成。

我更喜歡協議的方式,它更加嚴格和可靠。類別往往會造成建設問題,說實話,有點奇怪(在大多數情況下並非全部)。

+0

什麼樣的建築問題? – 2011-01-14 13:28:42

+0

在某些情況下,您可能會使用庫的混合,或者甚至自己編譯一個庫,而這些類別往往會出現問題。目前我還沒有一個明確的例子,但是我知道,由於類別的原因,我們的項目中的three20框架導致了這些類型的問題。不是一個大粉絲。 – Jake 2011-01-25 11:42:34

3

最大的區別在於@optional關鍵字是在幾年前才推出的。對於新代碼,非正式協議基本已過時。大部分框架都是非新代碼。