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

首頁 > 系統 > iOS > 正文

iOS內存管理中引用計數的學習

2019-10-21 18:41:16
字體:
來源:轉載
供稿:網友

1.引用計數的思考方式

  • 自己生成的對象,自己持有
  • 非自己生成的對象,自己也能持有
  • 不在需要自己持有的對象時釋放
  • 非自己持有的對象無法釋放

2.引用計數的實現

1.alloc方法

+ alloc+ allocWithZone:class_creatInstancecalloc

調用alloc方法首先調用allocWithZone:類方法,然后調用class_creatInstance函數,最后調用calloc來分配內存塊。

2.ratainCount/retain/release 方法

- retainCount__CFDoExternRefOperationCFBasicHashGetCountOfKey
- retain__CFDoExternRefOperationCFBasicHashAddValue
-retainCount__CFDoExternRefOperationCFBasicHashRemoveValue //CFBasicHashRemoveValue 為0時,-release調用dealloc

各個方法都通過同一個__CFDoExternRefOperation函數,調用一系列名稱相似的函數。并且從函數名看出蘋果采用散列表(引用計數表)來管理引用計數,表鍵值為內存塊地址的散列值。然而GNUStep將引用計數保存在對象占用內存塊頭部的變量中(objc_layout這個結構體中)。

內存塊頭部管理引用計數的好處:

  • 少量代碼皆可完成
  • 能夠統一管理引用計數內存塊與對象內存塊。

引用技術表管理引用計數的好處:

1. 對象內存快的分配無需考慮內存塊頭部

引用計數表各記錄中存有內存塊地址,可從各個記錄追溯到各個內存塊。

第二條特征在調試時很重要,即使出現故障導致對象占用的內存塊損壞,但只要引用計數表沒有被損壞,就能夠確認各個內存塊的地址

3.autorelease方法

NSAutoreleasePool是通過以AutoreleasePoolPage為結點的雙向鏈表來實現的。AutoreleasePoolPage是一個C++實現的類,類結構如圖:

iOS,內存管理,引用計數

  • magic 用來校驗 AutoreleasePoolPage 的結構是否完整;
  • next 指向最新添加的 autoreleased 對象的下一個位置,初始化時指向 begin() ;
  • thread 指向當前線程;
  • parent 指向父結點,第一個結點的 parent 值為 nil ;
  • child 指向子結點,最后一個結點的 child 值為 nil ;
  • depth 代表深度,從 0 開始,往后遞增 1;
  • hiwat 代表 high water mark 。

AutoreleasePoolPage每個對象會開辟4096字節內存(也就是虛擬內存一頁的大?。?,除了實例變量所占空間,剩下的空間全部用來儲存autorelease對象的地址。內存結構如圖:

iOS,內存管理,引用計數

在Cocoa框架中,NSRunloop每次循環過程中NSAutoreleasePool對象被生成或廢棄。在大量產生autorelease對象時,只要不廢棄NSAutoreleasePool那么生成的對象就不能被釋放,在此情況下有時會產生內存不足的現象,因此有必要適當的生成,持有和廢棄NSAutoreleasePool。通常在使用Objective-C,無論調用哪一個對象的autorelease/retain方法,實現上都是調用NSObject類的autorelease/retain實例方法,但是對于NSAutoreleasePool類,autorelease/retain實例方法已被重寫,因此運行時會出錯(exception)。autorelease實際上把對象的釋放時機交給NSAutoreleasePool管理,使用方法如下:

生成并持有NSAutoreleasePool對象。

NSAutoreleasePool *pool = [NSAutoreleasePool alloc] init]; // 等同于 objc_autoreleasePoolPush()

調用已分配對象的autorelease實例方法。

id obj = [NSObject alloc] init];[obj autorelease]; // 等同于 objc_autorelease()obj

廢棄NSAutoreleasPool對象(自動調用分配對象的release)。

[pool drain]; // 等同于 objc_autoreleasePoolPop(pool)

4.ARC說明

ARC(Automatic Reference Counting)是編譯階段自動做了retain/release,原先需要手動添加處理引用計數的代碼可以自動地由編譯器完成。ARC并不是GC,不是運行時內存管理,不會做malloc/free的工作,它只是一種代碼靜態分析(Static Analyzer)工具,同一程序中按文件單位可以選擇ARC有效和無效。Core Foundation中的malloc()或者free()等,還是需要自己手動進行內存管理。設置ARC有效的編譯方法如下:

  • 使用clang(LLVM編譯器)3.0或以上版本。
  • 指定編譯器屬性為”-fobjc-arc“。

3.引用計數查看

Apple 提供一些方法查看對象的引用計數,但是并不能完全信任這些函數提供的引用計數值。對于已釋放的對象一級不正確的對象地址,有時 也返回”1“,在多線程中,因為存在競態條件的問題,所以取得的的數值不一定可信。

[object retainCount]; //得到object的引用計數,此方法僅僅適用于MRC _objc_rootRetainCount(obj); //MRC和ARC都適用


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一色在线| 国产精品jizz在线观看麻豆| 91中文字幕在线观看| 亚洲片在线观看| 国产激情久久久| www亚洲精品| 午夜精品一区二区三区av| 九九精品视频在线| 欧美日韩亚洲91| 久久亚洲精品小早川怜子66| 97超级碰在线看视频免费在线看| 色与欲影视天天看综合网| 久久精品中文字幕电影| 国产在线久久久| 国产狼人综合免费视频| 欧美亚洲一区在线| 亚洲免费电影在线观看| 亚洲国产毛片完整版| 亚洲色图av在线| 国产精品一二三在线| 日韩av电影免费观看高清| 国产精品av在线| 国产精品7m视频| 韩曰欧美视频免费观看| 成人精品一区二区三区| 亚洲九九九在线观看| 懂色aⅴ精品一区二区三区蜜月| 欧美性在线观看| 国产精品美女在线观看| 日韩视频免费看| 国产有码一区二区| 97在线视频观看| 成人激情黄色网| 久久久国产成人精品| 精品久久久久久中文字幕| 欧美精品福利在线| 岛国av一区二区在线在线观看| 国产不卡视频在线| 在线看日韩欧美| 欧美小视频在线观看| 亚洲香蕉伊综合在人在线视看| 国产精品视频1区| 91久久精品国产91久久性色| 国产成人久久久精品一区| 日韩在线观看免费高清完整版| 91在线|亚洲| 91久久国产精品91久久性色| 日韩中文第一页| 久久亚洲私人国产精品va| 91国自产精品中文字幕亚洲| 欧美成人午夜激情视频| 精品国产一区二区三区久久| 精品日韩中文字幕| 精品国产31久久久久久| 韩国精品美女www爽爽爽视频| 日韩在线观看免费全| 日本亚洲欧美成人| 亚洲视频在线观看免费| 91精品视频免费| 国产xxx69麻豆国语对白| 亚洲天堂av在线免费观看| 久久精品国产96久久久香蕉| 青青a在线精品免费观看| 久久99久国产精品黄毛片入口| 欧美精品激情在线观看| 中文字幕日韩欧美精品在线观看| 自拍亚洲一区欧美另类| 欧洲亚洲在线视频| 国产成人免费av电影| 成人福利网站在线观看| 美女扒开尿口让男人操亚洲视频网站| 国产69精品久久久久9| 亚洲一区二区精品| 亚洲欧美自拍一区| 深夜福利一区二区| 国产精品偷伦视频免费观看国产| 日韩av高清不卡| 一个人看的www久久| 色无极亚洲影院| 国产亚洲精品久久久| 日韩视频免费中文字幕| 91中文在线视频| 欧美电影免费播放| 国产成人精品综合| 欧美黑人巨大精品一区二区| 欧美一级在线播放| 亚洲乱码国产乱码精品精天堂| 日韩电影中文字幕一区| 伊人久久久久久久久久久| 亚洲第一av在线| 欧美性受xxxx白人性爽| 午夜精品福利视频| 亚洲免费影视第一页| 精品亚洲一区二区三区在线观看| 亚洲丝袜一区在线| 国产美女精品视频免费观看| 中文国产亚洲喷潮| 91精品国产综合久久香蕉922| 国产日韩换脸av一区在线观看| 欧美激情视频一区| 国产精品69久久| 亚洲欧美日韩一区在线| 亚洲四色影视在线观看| 欧美黄网免费在线观看| 亚洲精品天天看| 8x拔播拔播x8国产精品| 欧美激情亚洲一区| 亚洲欧美国产视频| 青青草精品毛片| 在线播放精品一区二区三区| 色偷偷噜噜噜亚洲男人| 性欧美激情精品| 中文亚洲视频在线| 最新的欧美黄色| 久久久国产精品一区| 色视频www在线播放国产成人| 亚洲一区亚洲二区亚洲三区| 成人性生交大片免费看小说| 欧美日韩国产999| 日韩免费视频在线观看| 国产在线播放91| 亚洲最大福利网站| 国产免费一区视频观看免费| 国产精品久久久久久婷婷天堂| 69精品小视频| 亚洲成av人片在线观看香蕉| 欧美在线中文字幕| 日韩精品久久久久| 日韩欧美在线免费观看| 日韩国产高清污视频在线观看| 欧美最猛性xxxx| 午夜精品在线视频| 国产精品久久久久国产a级| 中文字幕视频在线免费欧美日韩综合在线看| 中文字幕日韩高清| 国产精品久久91| 亚洲精品美女在线观看| 最新国产成人av网站网址麻豆| 成人亚洲欧美一区二区三区| 欧美黄色片免费观看| 浅井舞香一区二区| 久久艹在线视频| 国产精品毛片a∨一区二区三区|国| 国产精品免费视频久久久| 亚洲精品中文字幕av| 日韩美女激情视频| 国产精品高潮呻吟久久av黑人| 国产黑人绿帽在线第一区| 51精品在线观看| 亚洲最大成人免费视频| 国产亚洲精品一区二区| 日韩大陆欧美高清视频区| 98视频在线噜噜噜国产| 国产精品日日摸夜夜添夜夜av| 国产精品第8页| 欧美日韩高清在线观看| 成人免费视频网| 国产日韩在线免费| 中文字幕9999| 成人av番号网| 欧美性xxxx极品高清hd直播| 日韩国产欧美精品在线| 国产美女直播视频一区| 亚洲女同精品视频|