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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Objective-C中MRC和ARC的自我理解

發(fā)布時(shí)間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-C中MRC和ARC的自我理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MRC: 手動引用計(jì)數(shù)。

?

alloc -- 分配一個對象的內(nèi)存空間

retain --使一個對象的引用計(jì)數(shù)加1

release --使一個對象的引用計(jì)數(shù)減1

retainCount --獲取當(dāng)前對象的引用計(jì)數(shù)值

aotorelese --調(diào)用對象的aotorelease方法的話,將對象的內(nèi)存管理放到aotorelease poll中,當(dāng)aotorelease poll結(jié)束的時(shí)候自動調(diào)用release操作,使引用計(jì)數(shù)減1

dealloc 在MRC中調(diào)用dealloc,需要顯示的調(diào)用 super dealloc方法,廢棄父類的方法。

在MRC模式下必須遵循誰創(chuàng)建,誰釋放,誰引用,誰管理

ARC : 自動引用計(jì)數(shù)

ARC是編譯器(LLVM)在對應(yīng)的位置自動插入retain和release操作之外,還需要Runtime的功能支持,是LLVM和Runtime協(xié)作的結(jié)果。ARC中禁止手動調(diào)用retain、release、retainCount、dealloc.

ARC中新增了weak、strong屬性關(guān)鍵字。

MRC和ARC的區(qū)別:

1、MRC是手動管理內(nèi)存,ARC是自動管理內(nèi)存,由編譯器和Runtime進(jìn)行協(xié)作。

2、ARC中禁止調(diào)用retain、release、autorelease、retainCount、dealloc操作

在MRC下使用ARC,使用?-fobjc-arc修飾文件,啟用ARC

在ARC下使用MRC,使用?-fno-objc-arc修飾文件,禁止ARC

strong和weak

strong強(qiáng)引用,執(zhí)行了retain操作,weak弱引用,表示該屬性是一種非擁有關(guān)系,沒有執(zhí)行retain操作。

weak屬性在設(shè)置新值時(shí)既不保留新值也不會釋放舊值,類似于assign;當(dāng)對象被釋放時(shí),屬性也會被清空。這樣可以有效地防止崩潰(因?yàn)镺C中給沒有對象地址的指針發(fā)送消息,不會崩潰;但是給有內(nèi)存地址但地址中是空對象的指針,即野指針,發(fā)送消息會崩潰)。

對于weak對象會放入一個hash表中,用weak指向的對象內(nèi)存地址作為key,當(dāng)此對象的引用計(jì)數(shù)值為0時(shí)會調(diào)用dealloc,使用key在hash表中搜索,將找到的所有對象置為nil。

Runtime如何實(shí)現(xiàn)weak變量的自動置nil?

引用計(jì)數(shù)管理

alloc的實(shí)現(xiàn):

經(jīng)過一些列函數(shù)的封裝調(diào)用,最終調(diào)用了c函數(shù)calloc。

此時(shí)并沒有設(shè)置引用計(jì)數(shù)值為1,但是我們通過retainCount獲取到的引用計(jì)數(shù)值為1。這是什么原因呢?

retain的實(shí)現(xiàn):

// 通過當(dāng)前對象的指針,經(jīng)過hash函數(shù)的運(yùn)算,可以快速的在sidetables找到它對應(yīng)的sidetable SideTable& table = SideTables()[this];// 在sidetable中去獲取引用計(jì)數(shù)map這樣的一個成員變量,然后通過當(dāng)前對象的指針,在sidetable的引用計(jì)數(shù)表中去獲取當(dāng)前對象的引用計(jì)數(shù)值。 size_t& refcntStorage = table.refcnts[this];// 對引用計(jì)數(shù)值進(jìn)行加1操作,size_t 是unsign long 型的,第一位是weakly_referenced第二位是deallocating 所以這里加的值不是實(shí)際的1,而是一個宏定義 SIZE_TABLE_RC_ONE,加的一個偏移量 refcntStorage += SIDE_TABLE_RC_ONE;// 這兩次都是hash查找,也就是說在進(jìn)行retain操作時(shí)經(jīng)歷了兩次hash查找。

思考一下:我們在進(jìn)行retain操作時(shí),系統(tǒng)是如何查找它對應(yīng)的引用計(jì)數(shù)的?

解析:通過兩次hash查找,來找到它對應(yīng)的引用計(jì)數(shù)值,然后進(jìn)行加一操作。這里的兩次查找,第一次是找到對應(yīng)的sidetable表,第二次是從表的引用計(jì)數(shù)表中獲取當(dāng)前對象的引用計(jì)數(shù)值。

release的實(shí)現(xiàn):

SideTable& table = SideTables()[this];//根據(jù)當(dāng)前對象指針訪問table的引用計(jì)數(shù)表,查到它當(dāng)前對應(yīng)的引用計(jì)數(shù)表。 RefcountMap::iterator it = table.refcnts.find(this);//把查找到的值進(jìn)行減一操作 it ->second -= SIDE_TABLE_RC_ONE;

retainCount實(shí)現(xiàn):

SideTable& table = SideTables()[this];// 聲明一個局部變量,初始值為1 size_t refcnt_result = 1;// 通過當(dāng)前對象拿到引用計(jì)數(shù)表中去查找 RefcountMap :: iterator it = table.refcnts.find(this);// 對結(jié)果做一個向右偏移的操作,然后再結(jié)合局部變量的1進(jìn)行加的操作 refcnt_result += it ->second >> SIDE_TABLE_RC_SHIFT;

這也就解釋了,alloc出來的對象,我們雖然沒有設(shè)置引用計(jì)數(shù)值為1,但是我們通過retainCount去獲取到的引用計(jì)數(shù)值為1的原因。

dealloc的實(shí)現(xiàn):

從下面流程圖來講述dealloc的實(shí)現(xiàn)原理:首先會先調(diào)用一個私有函數(shù)_objc_rootDealloc(),這個私有函數(shù)會調(diào)用一個rootDealloc()函數(shù),在這個函數(shù)內(nèi)部判斷當(dāng)前對象是否可以釋放;直接釋放的一個判斷條件是【1、判斷當(dāng)前對象是否使用了非指針型isa(NONPOINTER_ISA); 2、當(dāng)前對象是否有weak指針指向它,weakly_referenced; 3、當(dāng)前對象是否有關(guān)聯(lián)對象 has_assoc; 4、當(dāng)前對象是否涉及了C++相關(guān)的代碼 has_cxx_dtor以及當(dāng)前對象是否使用ARC來管理內(nèi)存; 5、當(dāng)前對象的引用計(jì)數(shù)是否通過sidetable的引用計(jì)數(shù)表來維護(hù)的has_sidetable_rc。】如果上述5個條件有任一個滿足,那就不能直接釋放,需要調(diào)用object_dispose()對象清除函數(shù)。如果上述5個條件,都不滿足,那就可以直接調(diào)用C函數(shù)free()直接釋放。

object_dispose()函數(shù)的實(shí)現(xiàn)

總結(jié)

以上是生活随笔為你收集整理的Objective-C中MRC和ARC的自我理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人av网站| 91视频青青草 | 亚洲伦理一区二区三区 | 亚洲一区二区三区在线 | 熟妇人妻无乱码中文字幕真矢织江 | 国产乱码精品一区二区三区不卡 | 国产av一区二区三区最新精品 | 爽插| 国产a级大片 | 免费黄色小说视频 | 在线观看深夜视频 | 在线不卡av | 激情啪啪网站 | 被警察猛c猛男男男 | 男女视频国产 | 亚洲性大片 | 黄色一级视频在线观看 | 欧美性极品xxxx做受 | 色噜噜狠狠一区二区三区果冻 | 精品国产一区在线观看 | 男人深夜网站 | 日日拍夜夜拍 | www.成人在线| www.五月天激情 | www.欧美亚洲 | 欧美一区亚洲 | 亚洲视频在线免费看 | 天天综合网永久 | 美女扒开腿男人爽桶 | 偷拍超碰 | 精品国产一区二区三区四 | 欧美一区二区三区四区视频 | 夜夜操天天爽 | 亚洲av无码不卡 | 黄色在线免费看 | 韩国久久精品 | 欧美日本亚洲 | 人人涩| 国产av天堂无码一区二区三区 | 999国内精品永久免费视频 | 国产激情成人 | 99国产精品一区 | 国产三级精品三级在线 | 国产在线欧美日韩 | 91在线观 | 国产视频导航 | 日韩av一区二区在线播放 | 天堂视频网 | 高潮毛片无遮挡高清免费 | 99久久婷婷国产精品综合 | 97青青草 | 国产极品美女高潮无套在线观看 | 夜夜夜夜夜操 | 美女屁股网站 | 插骚 | 美女穴穴 | 福利视频不卡 | 91大神久久 | 69av在线视频| 日韩一区二区免费看 | 免费黄色一级视频 | 波多野结衣一区二区三区在线观看 | 福利资源在线 | 韩国三级hd中文字幕的背景音乐 | 亚洲熟妇av一区二区三区漫画 | 四虎在线免费视频 | www.日本在线观看 | 又欲又污又肉又黄短文 | 天天做日日做 | www.一区二区三区 | 色综合av| 玖草在线观看 | 免费观看视频在线观看 | 嫩嫩av| 青娱乐在线视频观看 | av综合色 | 天天爽天天爽夜夜爽毛片 | 亚洲午夜精品久久久久久app | 国产av人人夜夜澡人人爽麻豆 | 美女被捅个不停 | 中国女人内96xxxxx | 日韩在线视频第一页 | 摸丰满大乳奶水www免费 | 三级av网址 | 帮我拍拍漫画全集免费观看 | 国产成人午夜 | 国产精品.xx视频.xxtv | 偷自在线 | 久久久久人妻一区精品色 | 日日干天天爽 | 日本三级一区二区 | 亚洲激情五月婷婷 | 国产精品嫩草影院av蜜臀 | 久久久久久久久久久影院 | 91丨九色丨蝌蚪丨对白 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 亚洲av人人夜夜澡人人 | 国产经典三级在线 | 日韩欧美成人精品 |