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

首頁 > 系統 > iOS > 正文

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

2020-07-26 02:28:19
字體:
來源:轉載
供稿:網友

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++實現的類,類結構如圖:

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

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

在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都適用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清一二三区| 国产成人涩涩涩视频在线观看| 亚洲欧美日韩国产中文| 久久成人精品一区二区三区| 欧美另类第一页| 91免费综合在线| 精品国产一区二区三区在线观看| 久久精品国产亚洲精品| 国产美女91呻吟求| 91在线观看免费高清| 精品久久久久久久久久久| 欧美日韩亚洲系列| 中文字幕9999| 午夜精品一区二区三区在线视频| 亚洲自拍偷拍第一页| 日产日韩在线亚洲欧美| 国产精品美女久久久久久免费| 欧亚精品在线观看| 亚洲无线码在线一区观看| 国产精品精品久久久久久| 欧美大片网站在线观看| 日韩成人免费视频| 麻豆乱码国产一区二区三区| 久久久国产精品一区| 丝袜美腿亚洲一区二区| 国产精品99久久久久久白浆小说| 国产精品久久久久久av福利软件| 久久精品视频99| 欧美—级高清免费播放| 亚洲美女喷白浆| 亚洲全黄一级网站| 俺也去精品视频在线观看| 亚洲国产精品美女| 久久久精品一区二区三区| 久久全球大尺度高清视频| 欧美成人免费在线视频| 国产精品aaa| 精品五月天久久| 日韩中文字幕视频| 国产日韩视频在线观看| 久久精品国产电影| 国产a∨精品一区二区三区不卡| 亚洲加勒比久久88色综合| 亚洲xxxx在线| 国内成人精品一区| 国产精品揄拍500视频| 亚洲精品国偷自产在线99热| 国产精品久久久久久久久久东京| 欧美日韩一区二区免费在线观看| 国产一区二区视频在线观看| 亚洲国产古装精品网站| 久久欧美在线电影| 亚洲精品有码在线| 97精品国产91久久久久久| 成人国产精品色哟哟| 日韩视频在线免费| 日韩网站免费观看高清| 7777精品久久久久久| 亚洲另类xxxx| 国产精品免费视频久久久| 日韩电影大全免费观看2023年上| 在线视频欧美日韩精品| 国内精品中文字幕| 亚洲最大在线视频| 中文字幕一区二区精品| www.日韩不卡电影av| 日韩一中文字幕| 欧美亚洲国产日本| 欧美激情啊啊啊| 亚洲精品欧美日韩| 亚洲伦理中文字幕| 欧洲成人免费aa| 91欧美精品午夜性色福利在线| 国产美女91呻吟求| 91亚洲午夜在线| 日韩毛片在线观看| 亚洲国产精品大全| 日韩69视频在线观看| 亚洲精品动漫久久久久| 亚洲xxxxx性| 国产精品专区一| 4p变态网欧美系列| 国产精品自拍偷拍| 国产中文欧美精品| 欧美在线视频观看免费网站| 国产精品视频自拍| 亚洲国产精品嫩草影院久久| 国产亚洲精品久久久久久| 国产精品 欧美在线| 久久久免费高清电视剧观看| 久久精品在线视频| 欧美xxxx做受欧美| 国产精品美女视频网站| 国产区亚洲区欧美区| 国产精品免费看久久久香蕉| 美女视频黄免费的亚洲男人天堂| 国产精品高清网站| 欧美亚洲午夜视频在线观看| 久久久久国产精品一区| 日韩视频免费在线| 亚洲第一在线视频| 亚洲人成啪啪网站| 亚洲精品视频播放| 91高清视频在线免费观看| 亚州欧美日韩中文视频| zzjj国产精品一区二区| 欧美黑人xxxⅹ高潮交| 尤物yw午夜国产精品视频| 91免费版网站入口| 精品视频在线导航| 久久精品国产一区| 亚洲欧美国产制服动漫| 欧美视频免费在线| 色偷偷偷综合中文字幕;dd| 日韩女在线观看| 国产成人短视频| 欧美成人性生活| 色综合视频一区中文字幕| 亚洲欧美激情在线视频| 日韩欧美在线一区| 中文字幕亚洲专区| 日韩小视频网址| 欧美激情中文网| 精品久久久视频| 日韩亚洲国产中文字幕| 国产女同一区二区| 欧美精品电影在线| 欧美老女人www| 久久久久久91| 激情成人在线视频| 欧美亚洲视频在线观看| 欧美成人合集magnet| 91精品视频免费| 国产精品爽爽ⅴa在线观看| 国产欧美精品一区二区三区介绍| 亚洲最大的av网站| 久久成人亚洲精品| 日韩视频免费看| 亚洲欧美中文另类| 日韩不卡在线观看| 成人免费午夜电影| 韩剧1988在线观看免费完整版| 日韩精品在线第一页| 欧美日韩激情视频| 日韩电视剧免费观看网站| 日韩精品欧美国产精品忘忧草| 欧美激情综合亚洲一二区| 国产女精品视频网站免费| 欧美成人四级hd版| 97视频在线观看免费| 亚洲女同性videos| 国产91精品在线播放| 91精品视频在线播放| 国产精品成人国产乱一区| 国产精品视频99| 国产精品入口夜色视频大尺度| 亚洲欧美激情一区| 亚洲国产成人久久| 久久亚洲精品视频| 国产精品视频大全| 中文字幕9999| 久久久久久久久久av| 亚洲一区二区久久| 海角国产乱辈乱精品视频|