ARC的原理詳解

2022-07-09 14:57:08 字數 1258 閱讀 1613

1,arc的本質

arc本質是nsautoreleasepool的直接應用,

@autorelease

其中:1,magic是魔術數字,劃分記憶體邊界,資料結構起始處;

2,next,是指向該autoreleasepool的邊界;

3,thread, 是該autoreleasepool的執行緒,每個執行緒有自己的autoreleasepool;

4,parent、child,用於建立鍊錶,乙個autoreleasepool不一定足夠;

每個nsautoreleasepool都是4096bytes,不夠的就申請新的nsautoreleasepool,用child, parent連線起來,見上圖:

1,「類例項所佔記憶體」就是資料介面nsautoreleasepool的空間;

2,「id objx」, 就是各個申請的物件指標;

3,next,指的是堆疊頂處;

物件是如何申請的?

所以,向乙個物件傳送- autorelease訊息,就是將這個物件加入到當前autoreleasepoolpage的棧頂next指標指向的位置

物件是如何釋放的?

每當進行一次objc_autoreleasepoolpush呼叫時,runtime向當前的autoreleasepoolpage中add進乙個哨兵物件,值為0(也就是個nil),那麼這乙個page就變成了下面的樣子:

1.根據傳入的哨兵物件位址找到哨兵物件所處的page

2.在當前page中,將晚於哨兵物件插入的所有autorelease物件都傳送一次- release訊息,並向回移動next指標到正確位置

3.補充2:從最新加入的物件一直向前清理,可以向前跨越若干個page,直到哨兵所在的page

剛才的objc_autoreleasepoolpop執行後,最終變成了下面的樣子:

巢狀的autoreleasepool

知道了上面的原理,巢狀的autoreleasepool就非常簡單了,pop的時候總會釋放到上次push的位置為止,多層的pool就是多個哨兵物件而已,就像剝洋蔥一樣,每次一層,互不影響。

簡單介紹 ARC 以及 ARC 實現的原理

簡單介紹 arc 以及 arc 實現的原理。arc 是蘋果在 wwdc 2011 提出來的技術,因此很多新入行的同學可能對此技術細節並不熟悉。但是,雖然 arc 極大地簡化了我們的記憶體管理工作,但是引用計數這種記憶體管理方案如果不被理解,那麼就無法處理好那些棘手的迴圈引用問題。所以,這道面試題其實...

canvas的arc 方法詳解

在做專案時畫曲線時主要用的就是arc 畫圓弧的方法 context.arc x,y,r,sangle,eangle,counterclockwise 即 arc 圓心的x座標,圓心的y座標,圓的半徑,起始角 以弧度計,即l圓心的3點鐘位置是0度 結束角,規定應該是順時針還是逆時針畫圖 其中最後乙個引...

iOS中ARC內部原理

你已經知道,arc會自動幫你插入retain和release語句。arc編譯器有兩部分,分別是前端編譯器和優化器。前端編譯器會為 擁有的 每乙個物件插入相應的release語句。如果物件的所有權修飾符是 strong,那麼它就是被擁有的。如果在某個方法內建立了乙個物件,前端編譯器會在方法末尾自動插入...