日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

弱引用 技巧

發(fā)布時間:2024/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 弱引用 技巧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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é)

以上是生活随笔為你收集整理的弱引用 技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。