弱引用 技巧
iOS培訓之教你學會iOS開發(fā)基本編程技巧
????? Objective-C 程序里的對象一起組成一張對象圖:由各個對象和其他對象的關(guān)系(或引用)而形成的網(wǎng)絡(luò)。對象之間的引用可分為一對一,還有一對多也就是通過對象集合引用。對于對象圖非常重要,因為它是使對象保持生命力的一個重要因素。編譯器會檢查對象圖中所用到的強與弱,根據(jù)需求保持對象發(fā)出的,或者是釋放對象信息。
????? 在 C 語言或?Objective-C?語言中,可以使用含有全局變量、實例變量或本地變量的結(jié)構(gòu)來構(gòu)造對象間的引用。這些結(jié)構(gòu)各自都有自己暗含的作用域。比如,本地變量引用的一個對象的作用域就是聲明它的函數(shù)塊所在的位置。和它一樣重要的是,對象之間的引用也存在著強與弱。
強引用: 會指示出自己的所有者是誰,指向別人的對象擁有被指向的對象。
弱引用則是指向別人的對象和被指向的對象之間沒有從屬關(guān)系。對象的生命周期由它的強引用數(shù)量多少決定。只要對象有強引用關(guān)系,就不會被釋放。
?
????? Objective-C 里的引用默認都是強引用。通常來說這很方便,讓編譯器管理對象的運行時生命周期,當你使用對象時它們不會被釋放。但是如果粗心未作全面檢查,對象間的強引用可能會形成無限循環(huán),如下圖左邊所示。這樣的循環(huán)鏈在運行時會導(dǎo)致運行時不會釋放任何一個對象,它們都有指向自己的強引用。繼而,這樣的死循環(huán)就造成了內(nèi)存泄露。?
?
????? 從上面圖的對象能夠看出,如果你取消 A 和 B 之間的引用,則 B、C、D、E 構(gòu)成的子對象圖將永不會從內(nèi)存中釋放,因為這些對象每一個都有強引用,形成了一個死循環(huán)。如果在 E 和 B 之間引入弱引用,就可以打破強引用死循環(huán)了。
為了修正強引用死循環(huán)的問題,精明的程序員會使用弱引用。運行時會持續(xù)跟蹤對象的弱引用。一旦對象不再有強引用,運行時就會從釋放該對象,并將所有指向該對象的引用改為 nil。對變量來說(全局、實例和本地變量),在對象名前面加上 __weak 限定詞就可以將其標記為弱引用。對于屬性來說,可以使用 weak 選項。
在以下這幾類引用中,你應(yīng)該使用弱引用:
??????1. 委托
?
??????在《設(shè)計模式》篇里,“用設(shè)計模式讓應(yīng)用開發(fā)流水線化”教程將向你詳解委托和目標機制。
??????2.未被頂級對象引用的插座變量(Outlet)
?
????? 插座變量是對象間的一種連接(或引用),被歸檔在故事版文件或 nib 文件中,當應(yīng)用運行并載入故事版或 nib 文件時就會恢復(fù)插座變量。故事版或 nib 文件中頂級對象的插座變量一般而言是窗口、視圖、視圖控制器或其他控制器等,應(yīng)該為 強引用(默認的,或未標記的)。
??????3.目標
????? 4.塊對象中指向 self 的引用
????? 塊對象會對它捕獲的變量產(chǎn)生強引用。如果在塊對象里運用了self的話,那么就會對self產(chǎn)生引用。所以,如果 self 對塊對象也有強引用,一般情況下都是這樣的,就形成了強引用死循環(huán)。為了避免死循環(huán),你需要在塊對象的外面創(chuàng)建一個指向 self 的 弱(或 __block)引用。
?
轉(zhuǎn)載于:https://www.cnblogs.com/iOS-mt/p/4170244.html
總結(jié)
- 上一篇: Signal Slot in Qt
- 下一篇: 常见算法动画