Cocoa物件 根類

2021-07-10 06:33:28 字數 4436 閱讀 9599

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不僅僅是乙個類的名稱,還是乙個協議的名稱。兩者對於定義乙個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:例項方法:

sel 

method

= @selector(riskall:);   

if ([myclass respondstoselector:method])   

[myclass performselector:method withobject:self];  

請注意,只有根類中定義的例項方法才可以在類物件中使用。在上面的例子中,如果myclass重新實現了respondstoselector:或者performselector:withobject:方法,則那些新的版本將只能用於例項物件。myclass的類物件只能執行nsobject類定義的版本(當然,如果myclass將respondstoselector:或performselector:withobject: 實現為類方法,而不是例項方法,則該類物件可以執行這些新的實現)。

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

Cocoa物件 根類

cocoa物件 根類是本文要介紹的內容,僅憑objective c語言和執行環境並不足以構造哪怕是最簡單的物件導向的程式,至少是不容易的。還缺少一些東西 即所有物件公有的基本行為和介面的定義。根類正是提供了這些定義。之所以叫根類,是因為它位於整個類層次 這裡是指cocoa的類層次 的根上。根類不從其...

Cocoa類與物件

蘋果已經將 objc runtime 開源了,我們可以從 瀏覽源 或 源 與c 相比,objc中的類與物件結構要簡潔與一致得多 參考 深度探索c 物件模型 你就知道c 中類與物件結構的複雜 本文將詳細講解objc中類與物件的結構,下回將講如何在 runtime 時操作類。我們可以在 usr incl...

Cocoa 深入淺出Cocoa 之動態建立類

在前文 深入淺出cocoa之類與物件 一文中,我已經詳細介紹了objc中的 class 與 object 的概念,今天我們來如何在執行 時動態建立類。下面這個函式就是應用前面講到的class,metaclass的概念,在執行時動態建立乙個類。這個函式來自 inside mac os x the ob...