日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARC的原理详解

發布時間:2024/4/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARC的原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,ARC的本質

ARC本質是NSAutoreleasePool的直接應用,

@autorelease{

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

其實是:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

int iRet =?UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

[pool release];

然后,各種allocrelease后,對應refcount都設置成0,在出自己的引用范圍后,就背nsautoreleasepool自動的釋放掉,如下:

NSString* str = [[[NSString alloc] init] autorelease];

.......

其中str已經進行了autorelease,當結束生命周期后,str直接釋放掉。

2,NSAutoreleasePool的原理

AutoreleasePoolPage是一個C++實現的類。

typedef struct{ magic_t const magic; id* next; pThread_t* thread; AutoreleasePoolPage* Parent; AutoreleasePoolPage* Child; uint32_t const depth; uint32_t hiwat; } 其中: 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對象就要滿了(也就是next指針馬上指向棧頂),這時就要執行上面說的操作,建立下一頁page對象,與這一頁鏈表連接完成后,新page的next指針被初始化在棧底(begin的位置),然后繼續向棧頂添加新對象。

所以,向一個對象發送- autorelease消息,就是將這個對象加入到當前AutoreleasePoolPage的棧頂next指針指向的位置

對象是如何釋放的? 每當進行一次objc_autoreleasePoolPush調用時,runtime向當前的AutoreleasePoolPage中add進一個哨兵對象,值為0(也就是個nil),那么這一個page就變成了下面的樣子:

objc_autoreleasePoolPush的返回值正是這個哨兵對象的地址,被objc_autoreleasePoolPop(哨兵對象)作為入參,于是:

1.根據傳入的哨兵對象地址找到哨兵對象所處的page

2.在當前page中,將晚于哨兵對象插入的所有autorelease對象都發送一次- release消息,并向回移動next指針到正確位置

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

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

嵌套的AutoreleasePool

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

?

轉載于:https://www.cnblogs.com/runner42/p/5031154.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的ARC的原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。