讀 Objective-C 高級編程(五)

筆記繼續(xù)叠纹,接著內(nèi)存管理ARC 規(guī)則之后赂乐,本篇將重點記錄下 ARC 內(nèi)存管理方式的實現(xiàn)(__strong 修飾符 和__weak 修飾符)慧库。

ARC 的實現(xiàn)

蘋果的官方說明中稱,ARC 是“由編譯器進(jìn)行內(nèi)存管理”的柠傍,但實際上只有編譯器是無法勝任的麸俘,在此基礎(chǔ)上還需要 Objective-C 運行時庫的協(xié)助。此處圍繞 clang 匯編輸出和 objc4庫(主要是 runtimr/objc-arr.mm)的源代碼進(jìn)行說明惧笛。

__strong 修飾符的實現(xiàn)

下面通過編譯器的模擬代碼从媚,說明在 alloc,new,copy.mutableCopy 的運行?

 id __strong obj = [[NSObject alloc] init];
id obj = objc_msgSend(NSObject,@selector(alloc));
objc_msgSend(obj,@selector(init));
obj_release(obj);
    

上面的模擬轉(zhuǎn)換中患整,可以看出此處是兩次調(diào)用 objc_msgSend 方法(alloc,init)拜效,變量作用域結(jié)束時通過 objc_release 釋放對象。雖然 ARC 有效是各谚,不能使用release方法紧憾,由此可知編譯器自動插入了 release

另外昌渤,我們也要注意除去 alloc,new,copy.mutableCopy 之外的方法說明赴穗,例如 NSMutableArray 中的 array

id __strong obj = [NSMutableArray array];
id obj = objc_msgSend(NSMutableArray,@selector(array));
objc_retainAutoreleasedReturnValue(obj);
objc_release(obj);

進(jìn)一步說明

+ (id)array
{
    return [[NSMutableArray alloc] init];
}
id obj = objc_msgSend(MSMutableArray,@selector(alloc));
objc_msgSend(obj,@selector(init));
retrun objc_autoreleaseReturnValue(obj);

此處要注意objc_retainAutoreleasedReturnValueobjc_autoreleaseReturnValue 兩者,兩者成對出現(xiàn),使函數(shù)最優(yōu)化程序運行般眉。它們可以不將對象注冊到 autoreleasepool 中而直接傳遞了赵,達(dá)到這一過程的的最優(yōu)化。

省略 autoreleasepool 注冊 優(yōu)化的過程

__weak 修飾符的實現(xiàn)

若附有__weak 修飾符的變量所引用的對象被廢棄甸赃,則將 nil 賦值給該變量柿汛。

 id __weak obj1 = obj;
id obj1;
obj_initWeak(&obj1,obj);
objc_destoryWeak(&obj1);

通過 objc_initWeak 函數(shù)初始化附有__weak 修飾符的變量,在變量作用域結(jié)束是通過objc_destoryWeak 釋放該變量埠对。

但此處要注意obj_initWeak 做的事情: 它將附有__weak 修飾符的變量初始化為0后络断,會將賦值的對象作為參數(shù)調(diào)用 objc_storeWeak 函數(shù)。

objc_storeWeak(&obj1,obj);

obj_storeWeak 函數(shù)將第二個參數(shù)的賦值對象的地址作為鍵值项玛,將第一個參數(shù)的附有__weak修飾符地址注冊到 weak 表(也是一個散列表)中貌笨。如果第二個參數(shù)是0,則將該變量的地址從 weak表中去掉稍计,也就實現(xiàn)了若附有__weak 修飾符的變量所引用的對象被廢棄,則將 nil 賦值給該變量的功能裕循。

objc_storeWeak(&obj1,obj);
objc_storeWeak(&obj1,0);

使用附有 __weak 修飾符的變量臣嚣,即是使用注冊到 autoreleasepool中的對象。

id __weak obj1 = obj;
id obj1;
obj_initWeak(&obj1,obj);
id tmp = objc_loadWeakRetained(&obj1);
objc_autorelease(tmp);
objc_destoryWeak(&obj1);

此時增加了兩個步驟:
(1)剥哑、objc_loadWeakRetained 函數(shù)取出附有__weak 修飾符變量所引用的對象并 retain硅则。
(2)、objc_autorelease 函數(shù)將對象注冊到 autoreleasepool中株婴。

由此可知怎虫,因為附有__weak 修飾符變量所引用的對象像這樣被注冊到 autoreleasepool 中,所以在自動釋放池結(jié)束之前都可以放心使用困介。但是大量使用附有__weak 修飾符的變量大审,注冊到 autoreleasepool的對象也會大量增加,因此這種大量使用的情況下座哩,最好還是先暫時賦值給附有__strong修飾符的變量后再使用徒扶。

通過__weak__strong 修飾符的大致實現(xiàn)后根穷,進(jìn)一步認(rèn)識了 ARC 姜骡。同時發(fā)現(xiàn)真是很有需要讀Objc runtime源碼,像里面的一些優(yōu)化屿良,確實做的很到位圈澈,雖說一下子學(xué)不下來具體實現(xiàn),但是思維的學(xué)習(xí)還是可以改善自己的尘惧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末康栈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谅将,老刑警劉巖漾狼,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饥臂,居然都是意外死亡逊躁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門隅熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稽煤,“玉大人,你說我怎么就攤上這事囚戚〗臀酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵驰坊,是天一觀的道長匾二。 經(jīng)常有香客問我,道長拳芙,這世上最難降的妖魔是什么察藐? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮舟扎,結(jié)果婚禮上分飞,老公的妹妹穿的比我還像新娘。我一直安慰自己睹限,他們只是感情好譬猫,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羡疗,像睡著了一般染服。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叨恨,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天肌索,我揣著相機(jī)與錄音,去河邊找鬼特碳。 笑死诚亚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的午乓。 我是一名探鬼主播站宗,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼益愈!你這毒婦竟也來了梢灭?” 一聲冷哼從身側(cè)響起夷家,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敏释,沒想到半個月后库快,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钥顽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年义屏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜂大。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡闽铐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶浦,到底是詐尸還是另有隱情兄墅,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布澳叉,位于F島的核電站隙咸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏成洗。R本人自食惡果不足惜五督,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泌枪。 院中可真熱鬧概荷,春花似錦秕岛、人聲如沸碌燕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽修壕。三九已至,卻和暖如春遏考,著一層夾襖步出監(jiān)牢的瞬間慈鸠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工灌具, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留青团,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓咖楣,卻偏偏與公主長得像督笆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诱贿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容