久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Cocoa對象 根類

     最初九月雪 2018-04-10


    Cocoa對象 根類是本文要介紹的內容,僅憑Objective-C語言和運行環境并不足以構造哪怕是最簡單的面向對象的程序,至少是不容易的。還缺少一些東西:即所有對象公有的基本行為和接口的定義。根類正是提供了這些定義。

    之所以叫根類,是因為它位于整個類層次(這里是指Cocoa的類層次)的根上。根類不從其它類繼承,但是類層次中的所有其它類都最終從根繼承下來。根類連同Objective-C語言,是Cocoa直接訪問Objective-C運行環境或與之交互的基本途徑。Cocoa對象的大部分對象行為能力都是從根類得到的。

    Cocoa提供了兩個根類:NSObject和NSProxy。Cocoa將后者定義為抽象類,用于表示其它對象的替身對象。因此NSProxy類在分布式對象架構中是很重要的。由于作用比較特別,NSProxy在Cocoa程序中出現頻率很低。Cocoa開發者在提到根類時,幾乎總是指NSObject。

    本部分將討論NSObject類,看看它如何與運行環境進行交互,以及它為所有Cocoa對象定義的基本行為和接口。其中主要是它為對象的內存分配、初始化、內存管理、內省、以及運行環境支持所聲明的方法。這些概念是理解Cocoa的基礎。

    NSObject

    NSObject是大多數Objective-C類層次的根類,它沒有超類。其它類從NSObject繼承訪問Objective-C語言運行時系統的基本接口,它們的實例可以得到對象行為的能力。

    雖然NSObject不是一個嚴格的抽象類,但它是個虛類。僅憑一個NSObject實例除了作為一個簡單的對象外,不能完成任何有用的工作。為了在您的程序中加入特有的屬性和邏輯,必須創建一個或多個從NSObject或其派生類繼承下來的類。

    NSObject采納了NSObject協議(參見"根類—和協議"部分)。NSObject協議支持多個根對象。舉例來說,NSProxy是另一個根類,它不是繼承自NSObject,但采納了NSObject協議,以便和其它Objective-C對象共用一個公共的接口。

    NSObject和java.lang.Object一起,是Java版本的Cocoa中所有類的根類,包括Foundation和Application Kit。

    根類—和協議

    NSObject不僅僅是一個類的名稱,還是一個協議的名稱。兩者對于定義一個Cocoa對象都是必要的。NSObject協議指定了Cocoa中所有根類必須的基本編程接口,因此不僅NSObject類采納了這個同名的協議,其它根類也采納這個協議,比如NSProxy。NSObject類進一步指定了不作為代理對象的Cocoa對象的基本編程接口。

    NSObject及類似的協議用于Cocoa對象的總體定義(而不是在類接口中包含那些協議),使多個根類成為可能。每個根類共用一個由它們采納的協議定義的公共接口。

    在另一種意義上,NSObject不僅僅是個“根”協議。雖然NSObject類沒有正式采納NSCopying、NSMutableCopying、和NSCoding協議,但它聲明和實現了與那些協議相關的方法(而且,包含NSObject類的NSObject.h頭文件中也包含上面提到的所有四個協議的定義)。對象拷貝、編碼、和解碼是對象行為的基本部分。很多子類(如果不是絕大多數的話)都希望采納和遵循這些協議。

    請注意:其它Cocoa類可以(而且確實是)通過范疇將方法添加到NSObject中。這些范疇通常是一些非正式的協議,在委托中使用。它們允許委托對象選擇實現范疇中的部分方法。然而,NSObject的范疇并不被認為是基本對象接口的一部分。

    根類方法概述

    NSObject根類和它采納的NSObject協議及其它“根” 協議一起,為所有不作為代理對象的Cocoa對象指定了如下的接口和行為特征:

    分配、初始化、和復制。NSObject類中的一些方法(包括一些來自協議的方法)用于對象的創建、初始化、和復制:

    alloc和allocWithZone:方法用于從某內存區域中分配一個對象內存,并使對象指向其運行時的類定義。

    init方法是對象初始化原型,負責將對象的實例變量設置為一個已知的初始狀態。initialize和load是兩個類方法,它們讓對象有機會對自身進行初始化。

    new是一個將簡單的內存分配和初始化結合起來的便利方法。

    copy和copyWithZone:方法用于拷貝實現這些(由NSCopying協議定義的)方法的類的實例。希望支持可變對象拷貝的類則需要實現mutableCopy和mutableCopyWithZone:(由NSMutableCopying協議定義)方法。

    更多信息請參見 "對象的創建"部分。

    對象的保持和清理。下面的方法對面向對象程序的內存管理特別重要:

    retain方法增加對象的保持次數。

    release方法減少對象的保持次數。

    autorelease方法也是減少對象的保持次數,但是以推遲的方式。

    retainCount方法返回對當前的保持次數。

    dealloc方法由需要釋放對象的實例變量以及釋放動態分配的內存的類實現。

    更多信息請參見 Cocoa對象的生命周期

    內省和比較。NSObjec有很多方法可以查詢對象的運行時信息。這些內省方法有助于找出對象在類層次中的位置,確定對象是否實現特定的方法,以及測試對象是否遵循某種協議。這些方法中的一部分僅實現為類方法。

    superclass和class方法(實現為類和實例方法)分別以Class對象的形式返回接收者的超類和類。

    您可以通過isKindOfClass:和isMemberOfClass:方法來確定對象屬于哪個類。后者用于測試接收者是否為指定類的實例。isSubclassOfClass:類方法則用于測試類的繼承性。

    respondsToSelector:方法用于測試接收者是否實現由選擇器參數標識的方法。instancesRespondToSelector:類方法則用于測試給定類的實例是否實現指定的方法。

    conformsToProtocol:方法用于測試接收者(對象或類)是否遵循給定的協議。

    isEqual:和hash方法用于對象的比較。

    description方法允許對象返回一個內容描述字符串;這個方法的輸出經常用于調試(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示對象。

    更多信息請參見 內省

    對象的編碼和解碼。下面的方法和對象的編解碼(作為歸檔過程的一部分)有關:

    encodeWithCoder:和initWithCoder:是NSCoding協議僅有的方法。前者使對象可以對其實例變量進行編碼,后者則使對象可以根據解碼過的實例變量對自身進行初始化。

    NSObject類中聲明了一些于對象編碼有關的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

    進一步信息請參見Cocoa的歸檔和序列化編程指南一文。

    消息的轉發。forwardInvocation:和相關的方法允許一個對象將消息轉發給另一個對象。

    消息的派發。以performSelector...開頭的一組方法使您可以在指定的延遲后派發消息,以及將消息從輔助線程派發(同步或異步)到主線程。

    NSObject還有幾個其它的方法,包括一些處理版本和姿態(后者使一個類在運行時將自己表示為另一個類)的類方法,以及一些訪問運行時數據結構的方法,比如方法選擇器和指向方法實現的函數指針。

    接口規范

    某些NSObject方法只是為了被調用,而另一些方法則是為了被重載。舉例來說,大多數子類不應該重載allocWithZone:方法,但必須實現init方法—至少需要實現一個最終調用根類的init方法(請參見"對象的創建"部分)的初始化方法。對于那些期望子類重載的方法,NSObject的實現或者什么也不做,或者返回一個合理的值,比如self。這些缺省實現使我們有可能向任意的Cocoa對象—甚至是沒有重載這些方法的對象—發送諸如init這樣得基本消息,而又不必冒運行時例外的風險。在發送消息之前,不必進行檢查(通過respondsToSelector:方法)。更加重要的是,NSObject的這些“占位”方法為Cocoa對象定義了一個公共的結構,并建立了一些規則,如果所有的對象都遵循這些規則,對象間的交互將更加可靠。

    實例方法和類方法

    運行環境系統以一種特殊的方式處理根類定義的方法。根類定義的實例方法可以由實例對象和類對象執行,因此所有類對象都可以訪問根類定義的實例方法。對于任何類對象,如果對象中不包含同名的類方法,就可以執行根類的所有實例方法。

    舉例來說,一個類對象可以通過發送消息來執行NSObject的respondsToSelector:和performSelector:withObject:實例方法:

    1. SEL method = @selector(riskAll:);   
    2. if ([MyClass respondsToSelector:method])   
    3.     [MyClass performSelector:method withObject:self];  

    請注意,只有根類中定義的實例方法才可以在類對象中使用。在上面的例子中,如果MyClass重新實現了respondsToSelector:或者performSelector:withObject:方法,則那些新的版本將只能用于實例對象。MyClass的類對象只能執行NSObject類定義的版本(當然,如果MyClass將respondsToSelector:或performSelector:withObject: 實現為類方法,而不是實例方法,則該類對象可以執行這些新的實現)。

    小結:Cocoa對象 根類的內容介紹完了,希望本文對你 有所幫助!

    【編輯推薦】

    【責任編輯:李程站 TEL:(010)68476606】

    點贊 0

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 亚洲欧美人成电影在线观看 | 亚洲精品日韩久久精品| 无码免费大香伊蕉在人线国产 | 精品九九人人做人人爱| 亚洲 制服 丝袜 无码| 国产裸体XXXX视频在线播放| 亚洲一区二区三区在线观看精品中文| 国产成人一区二区三区免费| 人人爽人人片人人片AV| A毛片终身免费观看网站| 欧美精品人人做人人爱视频| 欧美牲交a欧美牲交aⅴ图片| 国产老熟女狂叫对白| 人妻 日韩 欧美 综合 制服 | 免费无码一区无码东京热| 亚洲丰满熟女一区二区蜜桃| 玩弄放荡人妻少妇系列| 女人十八毛片A级十八女人 | 国产高清自产拍av在线| 亚洲中文字幕无码爆乳APP| 久久毛片少妇高潮| 免费人成视频在线观看网站| 久久国产成人av蜜臀| 免费无码专区毛片高潮喷水| 国产午夜亚洲精品国产成人| 九九久久精品国产免费看小说| 亚洲一区二区精品动漫| 国产精品自在线拍国产电影| 伊人成伊人成综合网222| 孕妇特级毛片ww无码内射| 国产高跟黑色丝袜在线| 亚洲人成网线在线播放VA| 亚洲综合激情另类小说区| 又色又污又爽又黄的网站| 精品国产一区av天美传媒| 亚洲爆乳少妇无码激情| 无码国模国产在线观看免费| 亚洲色拍拍噜噜噜最新网站| 久久亚洲中文字幕伊人久久大| 国产美女被遭强高潮免费一视频 | 亚洲更新最快无码视频|