欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS內(nèi)存管理引用計數(shù)示例分析

 更新時間:2023年01月06日 08:55:09   作者:山海飛鳥  
這篇文章主要為大家介紹了iOS內(nèi)存管理引用計數(shù)示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

內(nèi)存管理機制

目前流行的內(nèi)存管理機制主要有GCRC兩種。

  • GC (Garbage Collection):垃圾回收機制,定期查找不再使用的對象,釋放對象占用的內(nèi)存。
  • RC (Reference Counting):引用計數(shù)機制。采用引用計數(shù)來管理對象的內(nèi)存,當需要持有一個對象時,使它的引用計數(shù) +1;當不需要持有一個對象的時候,使它的引用計數(shù) -1;當一個對象的引用計數(shù)為 0,該對象就會被銷毀。

Objective-C支持三種內(nèi)存管理機制:ARC、MRCGC,但Objective-CGC機制有平臺局限性,僅限于MacOS開發(fā)中,iOS開發(fā)用的是RC機制,從MRC到現(xiàn)在的ARC。

一個新創(chuàng)建的OC對象引用計數(shù)默認是1,當引用計數(shù)減為0,OC對象就會銷毀,釋放其占用的內(nèi)存空間

調(diào)用retain會讓OC對象的引用計數(shù)+1,調(diào)用release會讓OC對象的引用計數(shù)-1

內(nèi)存管理的經(jīng)驗總結

  • 當調(diào)用alloc、newcopy、mutableCopy方法返回了一個對象,在不需要這個對象時,要調(diào)用release或者autorelease來釋放它
  • 想擁有某個對象,就讓它的引用計數(shù)+1;不想再擁有某個對象,就讓它的引用計數(shù)-1
  • 可以通過以下私有函數(shù)來查看自動釋放池的情況

extern void _objc_autoreleasePoolPrint(void);

以上我們對 “引用計數(shù)” 這一概念做了初步了解,Objective-C 中的 “對象” 通過引用計數(shù)功能來管理它的內(nèi)存生命周期。那么,對象的引用計數(shù)是如何存儲的呢?它存儲在哪個數(shù)據(jù)結構里?

首先,不得不提一下isa。

isa

  • isa指針用來維護 “對象” 和 “類” 之間的關系,并確保對象和類能夠通過isa指針找到對應的方法、實例變量、屬性、協(xié)議等;
  • 在 arm64 架構之前,isa就是一個普通的指針,直接指向objc_class,存儲著Class、Meta-Class對象的內(nèi)存地址。instance對象的isa指向class對象,class對象的isa指向meta-class對象;
  • 從 arm64 架構開始,對isa進行了優(yōu)化,用nonpointer表示,變成了一個共用體(union)結構,還使用位域來存儲更多的信息。將 64 位的內(nèi)存數(shù)據(jù)分開來存儲著很多的東西,其中的 33 位才是拿來存儲class、meta-class對象的內(nèi)存地址信息。要通過位運算將isa的值& ISA_MASK掩碼,才能得到class、meta-class對象的內(nèi)存地址。
// objc.h
struct objc_object {
    Class isa;  // 在 arm64 架構之前
};
// objc-private.h
struct objc_object {
private:
    isa_t isa;  // 在 arm64 架構開始
};
union isa_t 
{
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }
    Class cls;
    uintptr_t bits;
#if SUPPORT_PACKED_ISA
    // extra_rc must be the MSB-most field (so it matches carry/overflow flags)
    // nonpointer must be the LSB (fixme or get rid of it)
    // shiftcls must occupy the same bits that a real class pointer would
    // bits + RC_ONE is equivalent to extra_rc + 1
    // RC_HALF is the high bit of extra_rc (i.e. half of its range)
    // future expansion:
    // uintptr_t fast_rr : 1;     // no r/r overrides
    // uintptr_t lock : 2;        // lock for atomic property, @synch
    // uintptr_t extraBytes : 1;  // allocated with extra bytes
# if __arm64__  // 在 __arm64__ 架構下
#   define ISA_MASK        0x0000000ffffffff8ULL  // 用來取出 Class、Meta-Class 對象的內(nèi)存地址
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
    struct {
        uintptr_t nonpointer        : 1;  // 0:代表普通的指針,存儲著 Class、Meta-Class 對象的內(nèi)存地址
                                          // 1:代表優(yōu)化過,使用位域存儲更多的信息
        uintptr_t has_assoc         : 1;  // 是否有設置過關聯(lián)對象,如果沒有,釋放時會更快
        uintptr_t has_cxx_dtor      : 1;  // 是否有C++的析構函數(shù)(.cxx_destruct),如果沒有,釋放時會更快
        uintptr_t shiftcls          : 33; // 存儲著 Class、Meta-Class 對象的內(nèi)存地址信息
        uintptr_t magic             : 6;  // 用于在調(diào)試時分辨對象是否未完成初始化
        uintptr_t weakly_referenced : 1;  // 是否有被弱引用指向過,如果沒有,釋放時會更快
        uintptr_t deallocating      : 1;  // 對象是否正在釋放
        uintptr_t has_sidetable_rc  : 1;  // 如果為1,代表引用計數(shù)過大無法存儲在 isa 中,那么超出的引用計數(shù)會存儲在一個叫 SideTable 結構體的 RefCountMap(引用計數(shù)表)散列表中
        uintptr_t extra_rc          : 19; // 里面存儲的值是對象本身之外的引用計數(shù)的數(shù)量,retainCount - 1
#       define RC_ONE   (1ULL<<45)
#       define RC_HALF  (1ULL<<18)
    };
......  // 在 __x86_64__ 架構下
};

如果isanonpointer,即 arm64 架構之前的isa指針。由于它只是一個普通的指針,存儲著Class、Meta-Class對象的內(nèi)存地址,所以它本身不能存儲引用計數(shù),所以以前對象的引用計數(shù)都存儲在一個叫SideTable結構體的RefCountMap(引用計數(shù)表)散列表中。

如果isanonpointer,則它本身可以存儲一些引用計數(shù)。從以上union isa_t的定義中我們可以得知,isa_t中存儲了兩個引用計數(shù)相關的東西:extra_rchas_sidetable_rc

  • extra_rc:里面存儲的值是對象本身之外的引用計數(shù)的數(shù)量,這 19 位如果不夠存儲,has_sidetable_rc的值就會變?yōu)?1;
  • has_sidetable_rc:如果為 1,代表引用計數(shù)過大無法存儲在isa中,那么超出的引用計數(shù)會存儲SideTableRefCountMap中。

所以,如果isanonpointer,則對象的引用計數(shù)存儲在它的isa_textra_rc中以及SideTableRefCountMap中。

SideTable

// NSObject.mm
struct SideTable {
    spinlock_t slock;        // 自旋鎖
    RefcountMap refcnts;     // 引用計數(shù)表(散列表)
    weak_table_t weak_table; // 弱引用表(散列表)
    ......
}

SideTable存儲在SideTables()中,SideTables()本質(zhì)也是一個散列表,可以通過對象指針來獲取它對應的(引用計數(shù)表或者弱引用表)在哪一個SideTable中。在非嵌入式系統(tǒng)下,SideTables()中有 64 個SideTable。以下是SideTables()的定義:

// NSObject.mm
static objc::ExplicitInit<StripedMap<SideTable>> SideTablesMap;
static StripedMap<SideTable>& SideTables() {
    return SideTablesMap.get();
}

所以,查找對象的引用計數(shù)表需要經(jīng)過兩次哈希查找:

  • ① 第一次根據(jù)當前對象的內(nèi)存地址,經(jīng)過哈希查找從SideTables()中取出它所在的SideTable;
  • ② 第二次根據(jù)當前對象的內(nèi)存地址,經(jīng)過哈希查找從SideTable中的refcnts中取出它的引用計數(shù)表。

使用多個SideTable+分離鎖技術方案是為了保證線程安全的同時兼顧訪問效率

以上就是iOS內(nèi)存管理引用計數(shù)示例分析的詳細內(nèi)容,更多關于iOS內(nèi)存管理引用計數(shù)的資料請關注腳本之家其它相關文章!

相關文章

  • 百度地圖PC端判斷用戶是否在配送范圍內(nèi)

    百度地圖PC端判斷用戶是否在配送范圍內(nèi)

    在pc端設置商家的配送范圍,用戶在下單時,根據(jù)用戶設置的配送地點判斷是否在可配送范圍內(nèi),并給用戶相應的提示,下面通過本文給大家分享具有實現(xiàn)代碼,感興趣的朋友一起學習吧
    2016-01-01
  • iOS評分(評價)星星圖打分功能

    iOS評分(評價)星星圖打分功能

    這篇文章主要介紹了iOS評分(評價)星星圖打分功能,評分視圖分為展示和評分兩種,具體詳情大家可以通過本文詳細學習
    2016-11-11
  • 使用IOS AirPrint實現(xiàn)打印功能詳解

    使用IOS AirPrint實現(xiàn)打印功能詳解

    這篇文章主要介紹了使用IOS AirPrint實現(xiàn)打印功能詳解,想了解無線打印的同學,一定要看一下
    2021-04-04
  • IOS 聊天界面(自適應文字)的實現(xiàn)

    IOS 聊天界面(自適應文字)的實現(xiàn)

    本文主要介紹一個實現(xiàn)聊天界面的思路過程,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • iOS實現(xiàn)無限循環(huán)滾動的TableView實戰(zhàn)教程

    iOS實現(xiàn)無限循環(huán)滾動的TableView實戰(zhàn)教程

    這篇文章主要給大家介紹了關于iOS實現(xiàn)無限循環(huán)滾動的TableView的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • iOS基于UITableView實現(xiàn)多層展開與收起

    iOS基于UITableView實現(xiàn)多層展開與收起

    這篇文章主要為大家詳細介紹了iOS基于UITableView實現(xiàn)多層展開與收起的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • iOS App設計模式開發(fā)中對建造者模式的運用實例

    iOS App設計模式開發(fā)中對建造者模式的運用實例

    這篇文章主要介紹了iOS App設計模式開發(fā)中對建造者模式的運用實例,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2016-04-04
  • iOS開發(fā)中AVPlayer的簡單應用

    iOS開發(fā)中AVPlayer的簡單應用

    這篇文章主要介紹了iOS開發(fā)中AVPlayer的簡單應用,文中給出了簡單的介紹和示例代碼,相信對大家學習AVPlayer的應用具有一定的參考價值,需要的朋友們下面跟著小編來一起學習學習。
    2017-02-02
  • NSMutable?對象的坑解決分析

    NSMutable?對象的坑解決分析

    這篇文章主要為大家介紹了NSMutable?對象的坑解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • iOS實現(xiàn)選項卡效果的方法

    iOS實現(xiàn)選項卡效果的方法

    選項卡在我們?nèi)粘i_發(fā)的時候經(jīng)常要用到,所以這篇文章給大家分享一種iOS實現(xiàn)的簡單選項卡效果,很適合大家學習和使用,有需要的可以參考借鑒,下面來一起看看吧。
    2016-09-09

最新評論