版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Swift語(yǔ)言的其他主題12.1自動(dòng)引用計(jì)數(shù)12.2運(yùn)算符重載12.3泛型12.4錯(cuò)誤處理12.5綜合案例12.6上機(jī)實(shí)踐12.1自動(dòng)引用計(jì)數(shù)12.1.1自動(dòng)引用計(jì)數(shù)的工作機(jī)制12.1.2循環(huán)強(qiáng)引用的產(chǎn)生12.1.3循環(huán)強(qiáng)引用的解決方法12.1.1自動(dòng)引用計(jì)數(shù)的工作機(jī)制當(dāng)開(kāi)發(fā)者每一次創(chuàng)建一個(gè)類的新的實(shí)例時(shí),ARC會(huì)分配一大塊內(nèi)存用來(lái)存儲(chǔ)實(shí)例相關(guān)的信息,如實(shí)例的類型信息,實(shí)例所有相關(guān)的屬性值。當(dāng)實(shí)例不再被使用時(shí),ARC將會(huì)釋放此實(shí)例所占的內(nèi)存,并將釋放的內(nèi)存另作它用。這樣可以確保不再使用的實(shí)例不會(huì)一直占用內(nèi)存空間。12.1.2循環(huán)強(qiáng)引用的產(chǎn)生在編程中,開(kāi)發(fā)者可能會(huì)寫(xiě)出這樣的代碼,在程序中使用2個(gè)或者3個(gè)強(qiáng)引用。而這些強(qiáng)引用在不知不覺(jué)中就形成了循環(huán)(彼此之間進(jìn)行了關(guān)聯(lián))強(qiáng)引用。循環(huán)強(qiáng)引用是不會(huì)因?yàn)槠渲械哪骋粋€(gè)實(shí)例停止使用而進(jìn)行銷毀的,這樣將會(huì)導(dǎo)致內(nèi)存資源的泄露以及浪費(fèi)。本節(jié)將講解兩種造成循環(huán)強(qiáng)引用的原因。1.類實(shí)例之間的循環(huán)強(qiáng)引用在兩個(gè)類實(shí)例互相保留對(duì)方的強(qiáng)引用,并讓對(duì)方不被銷毀。這就構(gòu)成所謂的類實(shí)例之間的循環(huán)強(qiáng)引用。2.閉包引起的循環(huán)強(qiáng)引用當(dāng)開(kāi)發(fā)者將一個(gè)閉包賦值給類實(shí)例的某個(gè)屬性,并且在這個(gè)閉包體中又使用了實(shí)例,或者是閉包體中可能訪問(wèn)了實(shí)例的某個(gè)屬性,例如self.someProperty,或者閉包中調(diào)用了實(shí)例的某個(gè)方法,例如self.someMethod。這兩種情況都導(dǎo)致了閉包“捕獲”self,從而產(chǎn)生了循環(huán)強(qiáng)引用。12.1.3循環(huán)強(qiáng)引用的解決方法本小節(jié)將針對(duì)12.1.2小節(jié)中產(chǎn)生的兩種循環(huán)強(qiáng)引用進(jìn)行解決。1.解決類實(shí)例之間的循環(huán)強(qiáng)引用對(duì)于類實(shí)例之間產(chǎn)生的循環(huán)強(qiáng)引用的解決辦法有兩種:弱引用、無(wú)主引用。以下就是對(duì)這兩種辦法的詳細(xì)介紹。(1)弱引用弱引用不會(huì)牢牢保留住引用的實(shí)例,并且不會(huì)阻止ARC銷毀被引用的實(shí)例。這種行為阻止了引用變?yōu)檠h(huán)強(qiáng)引用。在聲明的屬性或者變量前面加上關(guān)鍵字weak進(jìn)可以定義弱引用,其語(yǔ)法形式如下:weekvar屬性名/變量名:數(shù)據(jù)類型(2)無(wú)主引用和弱引用類似,無(wú)主引用不會(huì)保留住引用的實(shí)例。和弱引用不同的是,無(wú)主引用是永遠(yuǎn)有值的。因此,無(wú)主引用總是被定義為非可選類型。開(kāi)發(fā)者可以在聲明屬性或者變量/常量時(shí),在前面加上關(guān)鍵字unowned表示這是一個(gè)無(wú)主引用,如語(yǔ)法形式如下:unownedlet/var屬性/常量/變量:類型(3)無(wú)主引用以及隱式解析可選屬性弱引用適用于兩個(gè)屬性的值都允許為nil,并會(huì)潛在的產(chǎn)生循環(huán)強(qiáng)引用的情況;無(wú)主引用主要適用于一個(gè)屬性的值允許為nil,而另一個(gè)屬性的值不允許為nil,并會(huì)潛在的產(chǎn)生循環(huán)強(qiáng)引用。但是還有第三種情況,就是兩個(gè)屬性都必須有值,并且初始化完成后不能為nil。在這種情況下,需要一個(gè)類使用無(wú)主屬性,而另外一個(gè)類使用隱式解析可選屬性。這會(huì)使兩個(gè)屬性在初始化完成后能被直接訪問(wèn),同時(shí)避免了循環(huán)引用。2.解決閉包引起的循環(huán)強(qiáng)引用在定義閉包時(shí),同時(shí)定義捕獲列表作為閉包的一部分,通過(guò)這種方式可以解決閉包和類實(shí)例之間的循環(huán)強(qiáng)引用。捕獲列表定義了閉包體內(nèi)捕獲一個(gè)或者多個(gè)引用類型的規(guī)則。跟解決兩個(gè)類實(shí)例間的循環(huán)強(qiáng)引用一樣,聲明每個(gè)捕獲的引用為弱引用或無(wú)主引用,而不是強(qiáng)引用。應(yīng)當(dāng)根據(jù)代碼關(guān)系來(lái)決定使用弱引用還是無(wú)主引用。(1)捕獲列表捕獲列表中的每個(gè)元素都是由weak或者unowned關(guān)鍵字和實(shí)例的引用(如self或someInstance)成對(duì)組成的。每一對(duì)都在方括號(hào)中,通過(guò)逗號(hào)分開(kāi)。其定義形式如下:[關(guān)鍵字self](2)弱引用和無(wú)主引用當(dāng)閉包和捕獲的實(shí)例總是互相引用,并且總是同時(shí)銷毀時(shí),將閉包內(nèi)的捕獲定義為無(wú)主引用。相反的,當(dāng)捕獲引用有時(shí)可能會(huì)是nil時(shí),將閉包內(nèi)的捕獲定義為弱引用。弱引用總是可選類型,并且當(dāng)引用的實(shí)例被銷毀后,弱引用的值會(huì)自動(dòng)置為nil。這可以讓開(kāi)發(fā)者在閉包內(nèi)檢查它們是否存在。12.2運(yùn)算符重載12.2.1為什么使用運(yùn)算符重載12.2.2算術(shù)運(yùn)算符的重載12.2.3一元負(fù)號(hào)/正號(hào)運(yùn)算符的重載12.2.4復(fù)合賦值運(yùn)算符的重載12.2.5自增自減運(yùn)算符的重載12.2.6比較運(yùn)算符的重載12.2.7自定義運(yùn)算符的重載12.2.1為什么使用運(yùn)算符重載通常情況下,運(yùn)算符只允許進(jìn)行數(shù)據(jù)與數(shù)據(jù)之間的運(yùn)算,這種普通的運(yùn)算,有時(shí)是無(wú)法滿足實(shí)際需求的。12.2.2算術(shù)運(yùn)算符的重載算術(shù)運(yùn)算符分為了+、-、*、/四種,它們都屬于中置運(yùn)算符。它的重載語(yǔ)法形式如下:func算術(shù)運(yùn)算符(參數(shù)名1:數(shù)據(jù)類型,參數(shù)名2:數(shù)據(jù)類型)->返回值的數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}12.2.3一元負(fù)號(hào)/正號(hào)運(yùn)算符的重載在操作數(shù)之前加一個(gè)“-”號(hào),此“-”號(hào)就被叫作一元負(fù)號(hào)運(yùn)算符符。它的作用是將正數(shù)變?yōu)樨?fù)數(shù),將負(fù)數(shù)變?yōu)檎龜?shù)。在一個(gè)操作數(shù)之前加一個(gè)“+”號(hào),此“+”號(hào)就被叫作一元正號(hào)運(yùn)算符。一元正號(hào)運(yùn)算符沒(méi)有實(shí)際作用。一元負(fù)號(hào)/正號(hào)運(yùn)算符也是可以重載的,以下就是這兩個(gè)運(yùn)算的重載。1.一元負(fù)號(hào)運(yùn)算符的重載一元負(fù)號(hào)運(yùn)算符的重載的語(yǔ)法形式如下:prefixfunc-(參數(shù)名:數(shù)據(jù)類型)->數(shù)據(jù)類型{
return返回?cái)?shù)據(jù)}2.一元正號(hào)運(yùn)算符的重載一元加運(yùn)算符的重載的語(yǔ)法形式如下:prefixfunc+(參數(shù)名:數(shù)據(jù)類型)->數(shù)據(jù)類型{
return返回?cái)?shù)據(jù)}12.2.4復(fù)合賦值運(yùn)算符的重載向“+=”運(yùn)算符、“-=”運(yùn)算符這類復(fù)合賦值運(yùn)算符也是可以實(shí)現(xiàn)重載的,其語(yǔ)法形式如下:func復(fù)合運(yùn)算符(inout參數(shù)名1:數(shù)據(jù)類型,參數(shù)名2:數(shù)據(jù)類型){
…}12.2.5自增自減運(yùn)算符的重載本小節(jié)將講解自增自減運(yùn)算符的重載。1.自增運(yùn)算符重載自增運(yùn)算符的重載可以分為前綴自增運(yùn)算符的重載和后綴自增運(yùn)算符的重載。以下是對(duì)這兩個(gè)重載的介紹。(1)前綴自增運(yùn)算符前綴自增運(yùn)算符的重載的語(yǔ)法形式如下:prefixfunc++
(inout參數(shù)名:數(shù)據(jù)類型)->返回值的數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}(2)后綴自增運(yùn)算符后綴自增運(yùn)算符的重載的語(yǔ)法形式如下:postfixfunc++(inout參數(shù)名:數(shù)據(jù)類型)->返回值的數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}2.自減運(yùn)算符重載自減運(yùn)算符的重載可以分為前綴自減運(yùn)算符的重載和后綴自減運(yùn)算符的重載。以下是對(duì)這兩個(gè)重載的介紹。(1)前綴自減運(yùn)算符的重載前綴自減運(yùn)算符的重載的語(yǔ)法形式如下:prefixfunc--(inout參數(shù)名:數(shù)據(jù)類型)->返回值的數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}(2)后綴自減運(yùn)算符的重載后綴自減運(yùn)算符的重載的語(yǔ)法形式如下:postfixfunc--(inout參數(shù)名:數(shù)據(jù)類型)->返回值的數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}12.2.6比較運(yùn)算符的重載比較運(yùn)算符也是可以進(jìn)行重載的。例如使用“==”相等運(yùn)算符可以實(shí)現(xiàn)判斷兩個(gè)類型是否相等,“!=”不相等類型可以判斷兩個(gè)類型是否不相等等等。比較運(yùn)算符進(jìn)行重載的語(yǔ)法形式如下:func比較運(yùn)算符(參數(shù)名1:數(shù)據(jù)類型,參數(shù)名2:數(shù)據(jù)類型)->數(shù)據(jù)類型{
return返回的數(shù)據(jù)}12.2.7自定義運(yùn)算符的重載自定義運(yùn)算符是由開(kāi)發(fā)者定義的。它分為前置自定義運(yùn)算符、中置自定義運(yùn)算符、后置自定義運(yùn)算符這三種。本小節(jié)就是對(duì)這三種自定義運(yùn)算符的介紹。1.前置自定義運(yùn)算符的重載前置自定義運(yùn)算符的定義形式如下:prefixoperator自定義運(yùn)算符{…}重載的形式如下:prefixfunc自定義運(yùn)算符(inout參數(shù)名:數(shù)據(jù)類型)->數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}2.中置自定義運(yùn)算符的重載中置自定義運(yùn)算符的定義形式如下:infixoperator自定義運(yùn)算符{…}重載的形式如下:func自定義運(yùn)算符(參數(shù)名1:數(shù)據(jù)類型,參數(shù)名2:數(shù)據(jù)類型)->數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}3.后置自定義運(yùn)算符的重載后置自定義運(yùn)算符的定義形式如下:postfixoperator自定義運(yùn)算符{…}重載的形式如下:postfixfunc自定義運(yùn)算符(inout參數(shù)名:數(shù)據(jù)類型)->數(shù)據(jù)類型{
…
return返回?cái)?shù)據(jù)}12.3泛型12.3.1泛型函數(shù)12.3.2泛型類型12.3.3泛型類的層次結(jié)構(gòu)12.3.4擴(kuò)展一個(gè)泛型類型12.3.5具有多個(gè)類型參數(shù)的泛型12.3.6類型約束12.3.7關(guān)聯(lián)類型12.3.1泛型函數(shù)泛型函數(shù)可以適用于任何類型,其定義形式如下:func函數(shù)名<T>(參數(shù)名1:T,參數(shù)名2:T,參數(shù)名3:T,…)->返回值類型{
…
return返回值}12.3.2泛型類型除了泛型函數(shù),Swift還允許開(kāi)發(fā)者定義泛型類型。這些自定義類、結(jié)構(gòu)和枚舉可以適用于任何類型,以下將主要講解這三種泛型類型。1.泛型枚舉泛型枚舉的定義形式如下:enum枚舉名稱<T>{
…}2.泛型結(jié)構(gòu)泛型結(jié)構(gòu)定義的形式如下:struct結(jié)構(gòu)名稱<T>{
…}創(chuàng)建某一類型的結(jié)構(gòu)對(duì)象的形式如下:let/var對(duì)象名=結(jié)構(gòu)名稱<數(shù)據(jù)類型>()3.泛型類泛型類的定義形式如下:class類名<T>{
…}創(chuàng)建某一類型的類對(duì)象的形式如下:let/varstringclass=類名<數(shù)據(jù)類型>()12.3.3泛型類的層次結(jié)構(gòu)泛型類可以是類的層次結(jié)構(gòu)的一部分,所以泛型類可以用作基類或者派生類。泛型層次結(jié)構(gòu)與非泛型層次結(jié)構(gòu)的主要不同在于:在泛型層次結(jié)構(gòu)中,泛型基類所在的任意類型參數(shù)都必須通過(guò)派生類沿著層次結(jié)構(gòu)向上傳遞。泛型類的層次結(jié)構(gòu)有兩種:一種是使用泛型基類的層次結(jié)構(gòu),另一種是使用泛型派生類的層次結(jié)構(gòu)。以下就對(duì)這兩種層次結(jié)構(gòu)的詳細(xì)講解。1.使用泛型基類泛型類可以用作基類。2.使用泛型派生類非泛型類也可以作為泛型派生類的基類。12.3.4擴(kuò)展一個(gè)泛型類型泛型類型也是可以進(jìn)行擴(kuò)展的,當(dāng)開(kāi)發(fā)者擴(kuò)展一個(gè)泛型類型的時(shí)候,并不需要在擴(kuò)展的定義中提供類型參數(shù)列表。更加方便的是,原始類型定義中聲明的類型參數(shù)列表在擴(kuò)展里是可以使用的,并且這些來(lái)自原始類型中的參數(shù)名稱會(huì)被用作原始定義中類型參數(shù)的引用。12.3.5具有多個(gè)類型參數(shù)的泛型在泛型中可以擁有多個(gè)類型泛型,這些類型參數(shù)需要使用“,”逗號(hào)分隔開(kāi)。12.3.6類型約束類型約束指定了一個(gè)必須繼承自指定類的類型參數(shù),或者遵循一個(gè)特定的協(xié)議或協(xié)議構(gòu)成。對(duì)于類型約束,開(kāi)發(fā)者可以在類型參數(shù)名后面寫(xiě)一個(gè)類型約束,并通過(guò)“:”冒號(hào)將其分割。對(duì)于泛型函數(shù)的類型約束的定義形式如下:func函數(shù)名稱<T:SomeClass,U:SomeProtocol,…>(someT:T,someU:U){
…}12.3.7關(guān)聯(lián)類型當(dāng)定義一個(gè)協(xié)議時(shí),有的時(shí)候聲明一個(gè)或多個(gè)關(guān)聯(lián)類型作為協(xié)議定義的一部分是非常有用的。一個(gè)關(guān)聯(lián)類型作為協(xié)議的一部分,給定了類型的一個(gè)占位名(或別名)。作用于關(guān)聯(lián)類型上實(shí)際類型在協(xié)議被實(shí)現(xiàn)前是不需要指定的。本小節(jié)將講解有關(guān)關(guān)聯(lián)類型的內(nèi)容。1.定義關(guān)聯(lián)類型關(guān)聯(lián)類型的定義需要使用到typealias關(guān)鍵字,其語(yǔ)法形式如下:typealias類型名2.擴(kuò)展已存在類型為關(guān)聯(lián)類型開(kāi)發(fā)者可以將已存在的類型擴(kuò)展為關(guān)聯(lián)類型。3.約束關(guān)聯(lián)類型類型約束能夠確保類型符合泛型函數(shù)或類的定義約束。對(duì)于關(guān)聯(lián)類型來(lái)說(shuō)約束也是非常有用的。對(duì)于關(guān)聯(lián)類型的約束需要使用where語(yǔ)句。一個(gè)where語(yǔ)句能夠使一個(gè)關(guān)聯(lián)類型遵循一個(gè)特定的協(xié)議,以及(或)那個(gè)特定的類型參數(shù)和關(guān)聯(lián)類型可以是相同的。開(kāi)發(fā)者可以寫(xiě)一個(gè)where語(yǔ)句,緊跟在類型參數(shù)列表后面。where語(yǔ)句后跟一個(gè)或者多個(gè)針對(duì)關(guān)聯(lián)類型的約束,以及(或)一個(gè)或多個(gè)類型和關(guān)聯(lián)類型間的等價(jià)關(guān)系。在泛型函數(shù)中約束關(guān)聯(lián)類型的語(yǔ)法形式如下:func函數(shù)名<Twhere約束內(nèi)容1,約束內(nèi)容2,…>12.4錯(cuò)誤處理12.4.1拋出錯(cuò)誤12.4.2捕獲錯(cuò)誤和處理錯(cuò)誤12.4.3清理動(dòng)作12.4.1拋出錯(cuò)誤拋出一個(gè)錯(cuò)誤可以讓開(kāi)發(fā)者表明有意外情況發(fā)生,導(dǎo)致正常的執(zhí)行流程無(wú)法繼續(xù)執(zhí)行。拋出錯(cuò)誤使用throws關(guān)鍵字。如果開(kāi)發(fā)者想要
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級(jí)英語(yǔ)Travel課件
- 《實(shí)驗(yàn)室空調(diào)系統(tǒng)》課件
- 《檔案價(jià)值鑒定》課件
- 單位管理制度集合大全人事管理篇十篇
- 單位管理制度集粹選集人力資源管理篇十篇
- 單位管理制度匯編大全人事管理篇
- 單位管理制度合并匯編【人員管理篇】
- 單位管理制度分享合集員工管理篇
- 單位管理制度范文大合集職工管理十篇
- 單位管理制度呈現(xiàn)匯編職員管理十篇
- 應(yīng)急救援員(五級(jí))理論知識(shí)考試題及答案
- 初中動(dòng)點(diǎn)問(wèn)題題目
- 前程無(wú)憂行測(cè)題庫(kù)及答案大全
- 合伙人權(quán)益糾紛解決合同
- 糧食工程技術(shù)專業(yè)人才培養(yǎng)方案(三年制高職)
- 理發(fā)店承包方案
- 機(jī)電材料見(jiàn)證取樣復(fù)試
- 二線干部工作總結(jié)
- 土石方挖運(yùn)工程承包合同范本
- 山東省濟(jì)南市七年級(jí)上學(xué)期期末英語(yǔ)試卷(附答案)
- 心身疾病的心理與康復(fù)治療
評(píng)論
0/150
提交評(píng)論