国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

NSObject:類與協(xié)議

2019-11-14 20:41:44
字體:
供稿:網(wǎng)友
命名空間
首先, 我們來看看這兩個有著相同命名的部分是怎么共存的。NSObject的類和協(xié)議在Objective-c中存在于不同的命名空間。你可以同時擁有相同命名的類和協(xié)議,但是他們在編程語言上是不相關(guān)聯(lián)的。
這就是NSObject。
 
如果你光看語句寫法,它們沒有什么不同。類命名可以用來發(fā)送消息,可以用在@interface的中做聲明,還可以看作類型名。而協(xié)議也可以用在同樣的地方,只是用法不同,所以很容易混淆。
 
根類
NSObject類屬于根類。根類在層級結(jié)構(gòu)中處于最高級,也就是說除此以外沒有更高層級。而且Objective-c中還有其他根類,不像java里只有一個java.lang.Object根類,其他所有的類都直接或間接的繼承于它。因此,Java代碼可以依據(jù)任何對象來實現(xiàn)它的基本方法。
 
Cocoa有多個根類,除了NSObject還有NSPRoxy等其他等級的根類。這只是部分原因,NSObject協(xié)議定義了一套所有的根類都可以實現(xiàn)的基礎方法,這樣在編碼時就容易找到了。
 
 
NSObject類遵循NSObject協(xié)議,這就是說,NSObject類實現(xiàn)了下面這些基礎方法:
 
  1. @interface NSObject <NSObject> 
 
NSProxy同樣遵循NSObject協(xié)議:
 
  1. @interface NSProxy <NSObject> 
NSObject協(xié)議包含了hash,isEqual:,description等方法。事實上,NSProxy遵循NSObject協(xié)議意味著你可以依靠實現(xiàn)NSProxy來實現(xiàn)NSObject方法。
 
 
順便說說Proxy
既然我們說到這里,為什么這里有一個NSProxy作為根類?
 
很多情況下你持有一個類,但可以不實現(xiàn)你不需要的方法。NSProxy顧名思義,proxy(代理、轉(zhuǎn)發(fā))就是很有用的。NSObject類實現(xiàn)了比NSObject協(xié)議更多的東西,比如鍵值編碼,可能你根本不需要用它。
 
建立proxy對象的目是為了預留大多數(shù)未實現(xiàn)的方法,使用forwardInvocation:方法來轉(zhuǎn)發(fā)。如果把NSObject作為子類則可能會引入更多包,那樣容易導致沖突。而NSProxy通過提供了一個不含多余內(nèi)容的簡潔超類來避免此類發(fā)生。
 
 
協(xié)議
實際上,鑒于我們并不經(jīng)常使用其他的根類,所以NSObject協(xié)議雖然很有用,但是在大部分Objective-C的編程中也沒有太多的用處。然而,它在我們創(chuàng)建自定義的協(xié)議時就派上用場了。
 
比如,我們可以這樣寫:
 
  1.  @protocol MyProtocol 
  2. - (void)foo; 
  3.  
  4. @end 
 
同時,你定義一個類指針:
 
  1. id<MyProtocol> obj; 
 
你可以這樣調(diào)用foo:
 
  1. [obj foo]; 
當然,你不能這樣使用description:
 
  1. [obj description]; // no such method in the protocol 
 
同樣,你也不能這樣比較兩者是否相等:
 
  1. [obj isEqual: obj2]; // no such method in the protocol 
總的來說,你不可能要求它來完成一般對象做的任何任務,僅在有需要的時候用,這就是為什么要引進NSObject的協(xié)議。協(xié)議是可以繼承于其他協(xié)議的,你可以這樣寫繼承于NSObject的協(xié)議:
 
  1. @protocol MyProtocol <NSObject> 
  2. - (void)foo; 
  3. @end 
 
這就是說,不僅僅對象遵循MyProtocol協(xié)議并響應-foo方法,而且可以響應所有在NSObject協(xié)議中類似的消息。正因為你應用中所有的對象都繼承于NSObject類并且遵循NSObject協(xié)議,這樣在實現(xiàn)MyProtocol的實例時不需要更多條件就可以使用NSObject的一般方法。
 
總結(jié)
Frameworks框架中有兩個不同的NSObject確實比較奇怪,理解透了還是很有用的。一個NSObject協(xié)議允許多個根類擁有相同的基礎方法,因此我們能很方便的聲明一個包含了相同基礎功能的協(xié)議 。正因為NSObject類遵循了NSObject協(xié)議,把所有的東西融合到一起。  

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 遵义市| 株洲县| 宜宾市| 获嘉县| 四子王旗| 瑞丽市| 防城港市| 大足县| 四平市| 贵德县| 凤城市| 兴义市| 杂多县| 黔西县| 赣榆县| 文昌市| 邵东县| 陆丰市| 蒲城县| 会东县| 晴隆县| 高邮市| 伊宁市| 雷山县| 白朗县| 丰顺县| 惠来县| 丰县| 贞丰县| 天津市| 巴林右旗| 乐至县| 通海县| 两当县| 庄河市| 信丰县| 北安市| 崇礼县| 冷水江市| 宣威市| 开封县|