我正在研究一些關於非正式協議和真實協議的基礎知識。令我困惑的是,Cocoa似乎在NSObject上使用了很多非正式的協議。這些非正式協議是NSObject的類別,它聲明方法,但實際上並沒有實現它們。在NSObject上使用非正式協議或使用可選方法的協議有什麼區別?
據我所知,他們使用非正式協議(換句話說,NSObject上沒有提供方法實現的類別)的唯一原因是在Xcode中給出一個自動完成提示。
一個示例是NSNibLoading.h中定義的-awakeFromNib方法,NSNibLoading.h是NSObject上的非正式協議。筆尖加載系統在運行時檢查對象是否實現該方法。如果是這樣,那麼它會調用它。
但現在讓我們想象一下,沒有任何功能稱爲非正式協議。另一種具有完全相同效果的替代方案將是一個真正的@protocol聲明,它聲明瞭一個可選方法-awakeFromNib。 NSObject只會採用該協議,編譯器會愉快地提供自動完成。
任何人都可以指出這兩種策略之間的巨大差異嗎?我沒有看到非正式協議的重點,但真的很想這樣做。
什麼樣的建築問題? – 2011-01-14 13:28:42
在某些情況下,您可能會使用庫的混合,或者甚至自己編譯一個庫,而這些類別往往會出現問題。目前我還沒有一個明確的例子,但是我知道,由於類別的原因,我們的項目中的three20框架導致了這些類型的問題。不是一個大粉絲。 – Jake 2011-01-25 11:42:34