最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS內(nèi)存管理中引用計數(shù)的學習

 更新時間:2018年05月03日 08:49:41   作者:windtersharp  
文章給大家分享了關于iOS內(nèi)存管理中引用計數(shù)的相關知識點,對此有需要的朋友可以跟著學習下。

1.引用計數(shù)的思考方式

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

2.引用計數(shù)的實現(xiàn)

1.alloc方法

+ alloc
+ allocWithZone:
class_creatInstance
calloc

調(diào)用alloc方法首先調(diào)用allocWithZone:類方法,然后調(diào)用class_creatInstance函數(shù),最后調(diào)用calloc來分配內(nèi)存塊。

2.ratainCount/retain/release 方法

- retainCount
__CFDoExternRefOperation
CFBasicHashGetCountOfKey
- retain
__CFDoExternRefOperation
CFBasicHashAddValue
-retainCount
__CFDoExternRefOperation
CFBasicHashRemoveValue //CFBasicHashRemoveValue 為0時,-release調(diào)用dealloc

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

內(nèi)存塊頭部管理引用計數(shù)的好處:

  • 少量代碼皆可完成
  • 能夠統(tǒng)一管理引用計數(shù)內(nèi)存塊與對象內(nèi)存塊。

引用技術表管理引用計數(shù)的好處:

1. 對象內(nèi)存快的分配無需考慮內(nèi)存塊頭部

引用計數(shù)表各記錄中存有內(nèi)存塊地址,可從各個記錄追溯到各個內(nèi)存塊。

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

3.autorelease方法

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

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

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

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

生成并持有NSAutoreleasePool對象。

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

調(diào)用已分配對象的autorelease實例方法。

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

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

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

4.ARC說明

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

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

3.引用計數(shù)查看

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

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

相關文章

  • iOS逆向工程使用LLDB的USB連接調(diào)試第三方App

    iOS逆向工程使用LLDB的USB連接調(diào)試第三方App

    這篇文章主要介紹了iOS逆向工程使用LLDB的USB連接調(diào)試第三方App,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS移動端軟鍵盤彈起空白和滾動穿透問題解決方案

    iOS移動端軟鍵盤彈起空白和滾動穿透問題解決方案

    這篇文章主要為大家介紹了iOS移動端軟鍵盤彈起空白和滾動穿透問題解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • iOS如何用100行代碼實現(xiàn)簡單的抽屜效果

    iOS如何用100行代碼實現(xiàn)簡單的抽屜效果

    最近在網(wǎng)上看到一些抽屜效果,看起來很酷!很眩!但是,下不下來看代碼, 所以決定還是自己寫吧!!這篇文章通過近100行的代碼就實現(xiàn)了簡單的抽屜效果,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • iOS使用xib手動實現(xiàn)動畫效果的方法

    iOS使用xib手動實現(xiàn)動畫效果的方法

    下面小編就為大家分享一篇iOS使用xib手動實現(xiàn)動畫效果的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS App初次啟動時的用戶引導頁制作實例分享

    iOS App初次啟動時的用戶引導頁制作實例分享

    這篇文章主要介紹了iOS App初次啟動時的用戶引導頁制作實例分享,其中判斷程序是否是第一次或版本更新以后第一次啟動是一個關鍵點,需要的朋友可以參考下
    2016-03-03
  • IOS 繪制三角形的實例詳解

    IOS 繪制三角形的實例詳解

    這篇文章主要介紹了IOS 繪制三角形的實例詳解的相關資料,希望通過本文大家能夠?qū)崿F(xiàn)三角形的繪制,需要的朋友可以參考下
    2017-09-09
  • 分析IOS RunLoop的事件循環(huán)機制

    分析IOS RunLoop的事件循環(huán)機制

    RunLoop是與線程相關的基礎架構中的一部分,它是一個處理事件的循環(huán)(線程進入這個循環(huán),運行事件處理程序來響應傳入的事件),RunLoop的目的是當有事件需要處理時,線程是活躍的、忙碌的,當沒有事件后,線程進入休眠。
    2021-06-06
  • 詳解iOS應用使用Storyboard布局時的IBOutlet與IBAction

    詳解iOS應用使用Storyboard布局時的IBOutlet與IBAction

    這篇文章主要介紹了iOS應用使用Storyboard布局時的IBOutlet與IBAction,文中還附帶講解了為什么IBOutlet屬性是weak的,需要的朋友可以參考下
    2016-04-04
  • iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果

    iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果

    這篇文章主要介紹了iOS CAReplicatorLayer實現(xiàn)脈沖動畫效果 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 總結iOS開發(fā)中的斷點續(xù)傳與實踐

    總結iOS開發(fā)中的斷點續(xù)傳與實踐

    本文先從斷點續(xù)傳問題開始,介紹斷點續(xù)傳概述和原理。接著結合筆者調(diào)研中嘗試的 AFHTTPRequestOpeartion,簡單分析源碼。最后分別基于 NSURLConnection,NSURLSessionDataTask 和 NSURLSessionDownloadTask 去實現(xiàn)應用重啟情況下的斷點續(xù)傳。下面一起來看看。
    2016-07-07

最新評論

高安市| 钦州市| 库车县| 盐城市| 三门峡市| 马龙县| 永登县| 上栗县| 襄汾县| 永康市| 新安县| 海淀区| 贵港市| 文山县| 滦南县| 新宁县| 长子县| 临漳县| 临朐县| 涟水县| 南召县| 巴中市| 雅江县| 红原县| 秭归县| 金沙县| 铁岭县| 泰兴市| 延吉市| 武平县| 漳平市| 成都市| 洛宁县| 泽普县| 鄱阳县| 武夷山市| 星座| 乳源| 本溪| 华池县| 马尔康县|