亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

實例講解Swift中引用類型的ARC自動引用計數

2020-03-09 17:47:57
字體:
來源:轉載
供稿:網友

一、引言

ARC(自動引用計數)是Objective-C和Swift中用于解決內存管理問題的方案。在學習Objective-C編程時經常會學習到一個關于ARC的例子:在一個公用的圖書館中,每次進入一人就將卡插入,走的時候將自己的卡拔出拿走。圖書館系統會判定只要有卡插入,就將圖書館的燈打開,當所有卡都被取走后,將圖書館的燈關掉。這個例子對應于Objective-C中的對象聲明周期管理十分貼切。每當一個對象增加一個引用時,其引用計數會加1,當一個引用被取消時,對象的引用計數減1,當引用計數減為0時,說明此對象將不再有任何引用,對象會被釋放掉,讓出內存。Swift也采用同樣的方式進行內存管理。

注意:在Swift中只有引用類型有自動引用計數,結構體、枚舉這類值類型是沒有引用計數的。關于引用計數的示例代碼如下:

class MyClass {  deinit{    print("MyClass deinit")  }}var cls1:MyClass? = MyClass()var cls2:MyClass? = cls1var cls3:MyClass? = cls2cls2 = nilcls1 = nil//執行下面代碼后才會打印“MyClass deinit”cls3 = nil

二、循環引用的處理方法

在開發中,開發者一不小心就會寫出產生循環引用的代碼,在上面的示例中可以看出,除非實例的引用全部解除,否則實例將不會調用析構方法,內存不會被釋放,如果在寫代碼時,A引用了B,同樣B也引用了A,那么實際上現在A和B的引用計數都是2,將A和B都置為nil后,A和B實例依然保有1個引用計數,都不會被釋放,實例如下:

class MyClassOne {  var cls:MyClassTwo?  deinit{    print("ClassOne deinit")  }}class MyClassTwo {  var cls:MyClassOne?  deinit{    print("ClassTwo deinit")  }}var obj1:MyClassOne? = MyClassOne()var obj2:MyClassTwo? = MyClassTwo()obj1?.cls = obj2obj2?.cls = obj1obj1=nilobj2=nil//沒有打印析構函數的調用信息

對于上面的情況,可以將屬性聲明稱weak類型來防止這種循環引用,weak的作用在于只是弱引用實例,原實例的引用計數并不會加1,示例如下:

//關于弱引用的演示class MyClassThree{  weak var cls:MyClassFour?  deinit{    print("ClassThree deinit")  }}class MyClassFour {  var cls:MyClassThree?  deinit{    print("ClassFour deinit")  }}var obj3:MyClassThree? = MyClassThree()var obj4:MyClassFour? = MyClassFour()obj3?.cls = obj4obj4?.cls = obj3obj4=nil//此時obj3中的cls也為nilobj3?.cls

若引用的實例被釋放后,其在另一個實例中的引用也將被置為nil,所以weak只能用于optional類型的屬性,然而在開發中還有一種情況,某個類必須保有另一個類的示例,這個實例不能為nil,但是這個屬性又不能影響其原始實例的釋放,這種情況也會造成循環引用,示例如下:

class MyClassFive{  var cls:MyClassSix  init(param:MyClassSix){    cls = param  }  deinit{    print("ClassFive deinit")  }}class MyClassSix{  var cls:MyClassFive?  deinit{    print("ClassSix deinit")  }}var obj6:MyClassSix? = MyClassSix()var obj5:MyClassFive? = MyClassFive(param: obj6!)obj6?.cls = obj5obj5=nilobj6=nil//沒有打印任何信息

上面的示例也會造成循環引用,然而MyClassFive類中的cls屬性為常量不可為nil,不可使用weak弱引用來做Swift中又提供了一個關鍵字unowned無主引用來處理這樣的問題,示例如下:

class MyClassFive{  unowned var cls:MyClassSix  init(param:MyClassSix){    cls = param  }  deinit{    print("ClassFive deinit")  }}class MyClassSix{  var cls:MyClassFive?  deinit{    print("ClassSix deinit")  }}var obj6:MyClassSix? = MyClassSix()var obj5:MyClassFive? = MyClassFive(param: obj6!)obj6?.cls = obj5obj5=nilobj6=nil

關于弱引用和無主引用,其區別主要是在于:

1.弱引用用于解決Optional值的引起的循環引用。

2.無主引用用于解決非Optional值引起的循環引用。

3.個人以為,弱引用可用下圖表示:

Swift,ARC,引用,自動引用計數

4.無主引用可用如下圖表示:

Swift,ARC,引用,自動引用計數

若將上面的代碼修改如下,程序會直接崩潰:

class MyClassFive{  unowned var cls:MyClassSix  init(param:MyClassSix){    cls = param  }  deinit{    print("ClassFive deinit")  }}class MyClassSix{  var cls:MyClassFive?  deinit{    print("ClassSix deinit")  }}var obj6:MyClassSix? = MyClassSix()var obj5:MyClassFive? = MyClassFive(param: obj6!)obj6?.cls = obj5obj6=nilobj5?.cls

上面所舉的例子滿足了兩種情況,一種是兩類實例引用的屬性都是Optional值的時候使用weak來解決循環引用,一種是兩類實例有一個為非Optional值的時候使用unowned來解決循環引用,然而還有第三種情況,兩類實例引用的屬性都為非Optional值的時候,可以使用無主引用與隱式拆包結合的方式來解決,這也是無主引用最大的應用之處,示例如下:

class MyClassSeven{  unowned var cls:MyClassEight  init(param:MyClassEight){    cls = param  }  deinit{    print("ClassSeven deinit")  }}class MyClassEight{  var cls:MyClassSeven!  init(){    cls = MyClassSeven(param:self)  }  deinit{    print("ClassEight deinit")  }}var obj7:MyClassEight? = MyClassEight()obj7=nil

除了在兩個類實例間會產生循環引用,在閉包中,也可能出現循環引用,當某個類中包含一個閉包屬性,同時這個閉包屬性中又使用了類實例,則會產生循環引用,示例如下:

class MyClassNine {  var name:String = "HS"  lazy var closure:()->Void = {    //閉包中使用引用值會使引用+1    print(self.name)  }  deinit{    print("ClassNine deinit")  }}var obj9:MyClassNine? = MyClassNine()obj9?.closure()obj9=nil//不會打印析構信息

Swift中提供了閉包的捕獲列表來對引用類型進行弱引用或者無主引用的轉換:

class MyClassNine {  var name:String = "HS"  lazy var closure:()->Void = {    [unowned self]()->Void in    print(self.name)  }  deinit{    print("ClassNine deinit")  }}var obj9:MyClassNine? = MyClassNine()obj9?.closure()obj9=nil

捕獲列表以中括號標識,多個捕獲參數則使用逗號分隔。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区日韩精品| 亚洲丁香婷深爱综合| 尤物yw午夜国产精品视频明星| 欧美色道久久88综合亚洲精品| 成人国产精品色哟哟| 91精品国产九九九久久久亚洲| 欧美成人免费在线视频| 国产精品视频色| 亚洲一区美女视频在线观看免费| 国产一区二区日韩精品欧美精品| 欧美极度另类性三渗透| 日韩高清av一区二区三区| 九九热这里只有精品6| 久久天天躁狠狠躁老女人| 日韩专区中文字幕| 亚洲欧美中文日韩在线| 亚洲精品视频网上网址在线观看| 国产亚洲欧美日韩精品| 日韩中文在线中文网三级| 亚洲成人av片| 超薄丝袜一区二区| 日本精品视频在线观看| 在线成人免费网站| 亚洲美女av在线| 亚洲欧美日韩国产中文| 久久免费视频网站| 国产在线一区二区三区| 久久久久久久久久国产| 欧美www在线| 国产精品成人一区二区三区吃奶| 98精品在线视频| 成人日韩av在线| 亚洲成人国产精品| 91社影院在线观看| 久久综合久中文字幕青草| 国产精品日日做人人爱| 欧美专区福利在线| 亚洲丝袜一区在线| 亚洲国产婷婷香蕉久久久久久| 日韩大片免费观看视频播放| 狠狠色狠狠色综合日日五| 亚洲电影第1页| 欧美成人精品一区二区| 久久精品福利视频| 一本一本久久a久久精品牛牛影视| 久久久成人av| 国产日韩中文字幕| 中文字幕欧美精品在线| 久久精品视频亚洲| 国产伦精品免费视频| 91黑丝高跟在线| 91在线视频导航| 色综合久久久久久中文网| 国产精品igao视频| 97在线免费观看| 日本精品免费一区二区三区| 日本欧美爱爱爱| 日韩电影大片中文字幕| 日韩禁在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久电影观看| 最近更新的2019中文字幕| 亚洲乱码一区av黑人高潮| 久久人人爽人人爽人人片亚洲| 91精品视频在线播放| 亚洲精品白浆高清久久久久久| 成人国产亚洲精品a区天堂华泰| 伊人男人综合视频网| 91九色国产社区在线观看| 欧美日韩在线影院| 国产精品亚洲第一区| 精品夜色国产国偷在线| 欧美午夜激情小视频| 在线视频中文亚洲| 色综合五月天导航| 精品视频—区二区三区免费| 亚洲人成亚洲人成在线观看| 亚洲人成在线电影| 亚洲高清久久久久久| 欧美劲爆第一页| 欧美亚洲国产另类| 亚洲曰本av电影| 国产女人18毛片水18精品| 亚洲免费视频网站| 欧美在线www| 91chinesevideo永久地址| 亚洲最大福利视频网| 亚洲第一黄色网| 欧美激情精品久久久久久蜜臀| 国产91色在线免费| 97在线看免费观看视频在线观看| 97欧美精品一区二区三区| 欧美美女操人视频| 国产精品日韩在线观看| 欧美激情videoshd| 欧美成人自拍视频| 日韩欧美中文在线| 日韩av在线网站| 欧美性猛交xxxx免费看漫画| 久久免费少妇高潮久久精品99| 韩剧1988在线观看免费完整版| 国产精品爱啪在线线免费观看| 国产欧美日韩最新| 日韩av中文字幕在线播放| 国产97在线|亚洲| xx视频.9999.com| 日韩精品日韩在线观看| 久久久中精品2020中文| 亚洲一区美女视频在线观看免费| 中文字幕精品一区二区精品| 国产精品日韩专区| 国产精品久久久久久久久久新婚| 在线日韩中文字幕| 久久久久日韩精品久久久男男| 久青草国产97香蕉在线视频| 国产欧美精品一区二区| 97视频com| 色一情一乱一区二区| 欧美日韩高清区| 国产精品视频一区二区高潮| 久久久999成人| 久久影院中文字幕| 亚洲人成在线观| 91人成网站www| 国产91精品网站| 日韩精品中文字幕在线| 国产91精品久久久| 亚洲国产欧美精品| 成人一区二区电影| 日韩中文字幕在线| 亚洲国产婷婷香蕉久久久久久| 亚洲人成网站777色婷婷| 欧美在线亚洲一区| 国产成人亚洲综合青青| 日本成人激情视频| 亚洲第一精品自拍| 最新国产精品亚洲| 国产精品久久久久久av福利软件| 亚洲高清免费观看高清完整版| 91国内免费在线视频| 亚洲综合日韩在线| 久久深夜福利免费观看| 欧美一区二粉嫩精品国产一线天| 国产精品久久久久av免费| 国产日韩中文字幕| 欧美成人亚洲成人日韩成人| 久久香蕉频线观| 日韩成人久久久| 中文字幕一区电影| 91地址最新发布| 久久久www成人免费精品张筱雨| 欧美高清理论片| 97人洗澡人人免费公开视频碰碰碰| 国产日韩在线亚洲字幕中文| 国产精品99导航| 日韩精品视频在线播放| 中文字幕日韩av综合精品| 亚洲a级在线播放观看| 亚洲欧美在线x视频| 91精品国产高清自在线| 欧美国产日韩一区二区在线观看| 国产一区二区三区免费视频| 伦理中文字幕亚洲| 欧美交受高潮1|