參考書籍:《精通objective-c》【美】 keith lee
<a href="#%e7%b2%be%e9%80%9aobjective-c%e7%b1%bb%e6%8e%a5%e5%8f%a3%e5%8d%8f%e8%ae%ae%e4%b8%8e%e6%89%a9%e5%b1%95">精通objective-c類接口協定與擴充</a>
<a href="#%e7%9b%ae%e5%bd%95">目錄</a>
<a href="#%e7%b1%bb">類</a>
<a href="#%e7%b1%bb%e7%9a%84%e6%8e%a5%e5%8f%a3">類的接口</a>
<a href="#%e7%b1%bb%e7%9a%84%e5%ae%9e%e7%8e%b0">類的實作</a>
<a href="#%e5%ae%9e%e4%be%8b%e5%8f%98%e9%87%8f">執行個體變量</a>
<a href="#%e5%b1%9e%e6%80%a7">屬性</a>
<a href="#%e6%96%b9%e6%b3%95">方法</a>
<a href="#%e5%8d%8f%e8%ae%ae">協定</a>
<a href="#%e5%88%86%e7%b1%bb">分類</a>
<a href="#%e6%89%a9%e5%b1%95">擴充</a>
建立一個類名為atom,繼承于nsobject的類。atom類由兩個檔案組成,atom.h和atom.m,分别為類的接口和實作。
atom類的接口是在頭檔案atom.h中設定的,用于聲明類的屬性和方法。
實作atom類的代碼在atom.m中,用于定義類的執行個體變量,屬性和方法。
完成類的實作後,就可以在其他類中使用它了。
執行個體變量值為類聲明的變量,它們在相應類執行個體(即對象)的聲明周期中存在并擁有值。當對象被建立時,系統會為執行個體變量配置設定記憶體,當對象被建立時,系統會為執行個體變量配置設定記憶體,當對象被釋放時系統也會釋放變量占用的記憶體。執行個體變量擁有與對象對應的作用範圍與命名空間。
執行個體變量可以類的接口或實作部分中聲明,不過在類的接口中聲明會違法oop(面向對象程式設計)的封裝原則,是以,最好在類的實作部分中聲明執行個體變量。
盡管執行個體變量可以友善、直接地通路對象的狀态,但是會暴露類的内部,違反opp的封裝原則,是以隻應在必要時聲明執行個體變量,更好的方式是使用屬性。屬性與執行個體變量的差別是,屬性無法直接通路對象的内部狀态,但提供了通路這類資料的友善機制(getter/setter方法)。
屬性的常用特性:
類别
特性
描述
原子性
nonatomic
使用該特性可以在多線程并發的情況中,将通路器設定為非原子性,因而能夠提供不同的結果。否則,通路器會擁有原子性,指派和傳回結果永遠都會同步
設定器語義
assign
預設設定,屬性的設定器方法執行簡單的指派操作
retain
setter方法先release舊值,再retain新值,拷貝時為指針拷貝
copy
setter方法先release舊值,再複制新值,拷貝時為值拷貝
strong
屬性使用arc記憶體管理功能時,等于retain特性
weak
屬性使用arc記憶體管理功能時,類似assign特性
可讀寫性
readwrite
預設設定,屬性可讀寫
readonly
隻讀屬性
方法名稱
getter=gettername
将getter方法重命名為新讀取器的名稱
setter=settername
将setter方法重命名為新讀取器的名稱
屬性定義有多種方法:顯式定義,通過關鍵字補全和自動補全。
顯式定義:
通過關鍵字補全:
自動補全:
編譯器會對沒有使用關鍵字(如@synthesize)、不是動态生成的或沒有使用者編寫getter和setter方法的屬性補全已聲明的屬性和相應的執行個體變量。
通路屬性可以用通路器方法和點文法,編譯器會根據标準命名習慣自動補全通路器方法,getter方法擁有與屬性相同的名稱,setter方法其名稱以set開頭,後跟首字母大寫的屬性名。
方法聲明由方法類型,傳回值類型和一個或多個方法代碼段(包括名稱,參數,參數類型)構成。
方法的類型辨別符表明了該方法是類方法還是執行個體方法。類方法由+(加号)表示,這表示該方法擁有類的作用範圍,這意味着它使用類級的操作并且無法通路類的執行個體變量(除非這些變量被當做參數傳給它)。執行個體方法由-(減号)表示,這表明該方法擁有對象的作用範圍,這意味着它使用執行個體級的操作,并且可以直接通路對象及其父對象的執行個體變量(根據執行個體變量上設定的通路控制)。
傳回值類型表明了方法傳回變量的類型。傳回值的類型在方法類型後面的圓括号中設定。
方法代碼段由名稱,參數,參數類型組成,如<code>withprotons:(nsuinteger)protons</code>中withprotons是名稱,nsuinteger是參數類型,protons是參數。
對象(發送器)通過發送消息與其他對象(接收器)進行互動,進而調用指定的方法。以下為調用方法的例子:
使用協定聲明的方法和屬性可以由任何類實作。協定使objective-c支援多重繼承的概念。下面建立一個名為writer遵循nsobject協定的協定。
在atom.h中接收協定
在atom.m中實作協定
使用分類可以在不進行子類化的情況下,為已經存在的類增加功能。分類通常用于:1.拓展其他人定義的類(即使無法通路源碼);2.代替子類;3.将新類的實作代碼分發給多個源檔案。
建立一個拓展atom的分類nuclear,并聲明定義一個方法。
nuclear接口代碼:
nuclear實作代碼:
然後atom類型對象就可以直接調用該方法。
可以将擴充視為一種匿名(即未命名的)分類。在擴充中聲明的方法必須在相應類的主@implementation塊中實作,無法在分類中實作。拓展與分類的差別是它能夠聲明執行個體變量和屬性。以下是在atom.m中實作擴充。