iOS 內(nèi)存管理(二)

一悔据、簡介

深入了解ARC墓卦,主要從一下幾個修飾符深入了解 __strong/__weak/_atuoreleasing

1票摇、__strong

首先時當(dāng)編譯器初始化strong類型對象時化焕,編譯器偽代碼如下

id obj = objc_msgSend(NSObject,@selector(alloc));

objc_msgSend(obj,@selector(init));

objc_release(obj);

生成對象時烛亦,是以消息發(fā)送的方式去分配內(nèi)存空間和對象左腔,后用release方法釋放對象唧垦,當(dāng)為ARC時不需顯示調(diào)用release方法,編譯器會插入該方法翔悠。

相對于系統(tǒng)的 alloc/new/copy/mutablecopy 來說

另一些方法初始化如:id obj=[NSMutableArray array];

id obj = objc_msgSend(NSObject,@selector(alloc));

objc_retainAutoreleasedReturnVlaue(obj); //編譯器插入 用于優(yōu)化程序业崖,相對應(yīng)的成對get方法時使用:objc_autoreleaseReturnValue(obj); 通過該過程的兩個方法 在初始化和獲取后調(diào)用野芒,就不必將對象注冊autoreleaspool中,而是直接返回該對象双炕,優(yōu)化了運行程序時間及步驟

objc_release(obj);?

2狞悲、__weak修飾符

有weak 初始化的對象,是不能被持有妇斤,會被立即釋放摇锋;編譯器會生成一個全局的弱引用表;當(dāng)對弱引用對象操作時不會做引用計數(shù)加減操作站超;

編譯器釋放弱引用對象是怎樣的

1)從weak表中獲取釋放對象的地址為鍵值的記錄

2)將記錄的__weak修飾的變量地址荸恕,并賦值為nil;并從表中刪除該記錄

初始化對象時死相,不可直接 用__weak 否則會直接被釋放

注意:如沒循環(huán)引用建議不要插入weak融求,大量操作會影響cpu性能

3、__autorelease修飾符

用該修飾符初始化的對象算撮,等同于在mrc 中生宛,插入了autorelease;使得對象在不使用時能得以釋放

知識點補充:

深拷貝淺拷貝

理解NSString使用copy及strong修飾的原理

1. copy出來的字符串一定是不可變字符串肮柜,如果傳入的是可變字符串陷舅,會發(fā)生深拷貝為不可變字符串,否則為淺拷貝审洞。

2. mutablecopy莱睁,一定是深拷貝,拷貝出來的一定是可變字符串或者數(shù)組芒澜,即使傳入的是不可變字符串或者數(shù)組仰剿。

理解:

為什么NSString使用copy修飾也就可以理解了。使用copy修飾之后痴晦,即使屬性拷貝來自可變字符串酥馍,也會被深拷貝成不可變字符串,也就是源字符串修改之后不會影響到屬性字符串阅酪,增強了代碼的健壯性。

關(guān)于不可變字符串和數(shù)組的copy是淺拷貝也很好理解汁针,既然數(shù)據(jù)源本身是不可變的术辐,也就是具備安全性,那么系統(tǒng)默認(rèn)淺拷貝其中數(shù)據(jù)施无,顯然是合理的做法辉词。

Tagged Pointer技術(shù),用于優(yōu)化NSNumber猾骡、NSDate瑞躺、NSString等小對象的存儲,使用Tagged Pointer之后敷搪,NSNumber指針里面存儲的數(shù)據(jù)變成了:Tag + Data,也就是將數(shù)據(jù)直接存儲在了指針中那么他就不是一個對象了幢哨。

1 當(dāng)字符串很短的時候iOS會使用Tagged Pointer對NSString進(jìn)行優(yōu)化赡勘,此時NSString內(nèi)存地址是Tag + Data,那么它就不是一個對象了捞镰,因此它也就沒有setName方法闸与,所以他也就不會調(diào)用setName方法而是直接賦值

2 那么當(dāng)字符串很長,那么就不會使用Tagged Pointer技術(shù)岸售,那么他就是一個普通的字符串對象践樱,當(dāng)開啟多個線程并行調(diào)用setName方法時在調(diào)用[_name release];時有可能_name已經(jīng)被上一個線程給release過了,它的引用計數(shù)為零了凸丸,那么這是再有一個線程調(diào)用release就會報壞內(nèi)存訪問拷邢。解決辦法就是name聲明成atomic,或者在調(diào)用self.name時加鎖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屎慢,一起剝皮案震驚了整個濱河市瞭稼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抛人,老刑警劉巖弛姜,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妖枚,居然都是意外死亡廷臼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門绝页,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠商,“玉大人,你說我怎么就攤上這事续誉±趁唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵酷鸦,是天一觀的道長饰躲。 經(jīng)常有香客問我,道長臼隔,這世上最難降的妖魔是什么嘹裂? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮摔握,結(jié)果婚禮上寄狼,老公的妹妹穿的比我還像新娘。我一直安慰自己氨淌,他們只是感情好泊愧,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布伊磺。 她就那樣靜靜地躺著,像睡著了一般删咱。 火紅的嫁衣襯著肌膚如雪屑埋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天腋腮,我揣著相機與錄音雀彼,去河邊找鬼。 笑死即寡,一個胖子當(dāng)著我的面吹牛徊哑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聪富,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼莺丑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了墩蔓?” 一聲冷哼從身側(cè)響起梢莽,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奸披,沒想到半個月后昏名,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阵面,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年轻局,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片样刷。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡仑扑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出置鼻,到底是詐尸還是另有隱情镇饮,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布箕母,位于F島的核電站储藐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘶是。R本人自食惡果不足惜邑茄,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俊啼。 院中可真熱鬧,春花似錦左医、人聲如沸授帕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跛十。三九已至彤路,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芥映,已是汗流浹背洲尊。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奈偏,地道東北人坞嘀。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像惊来,于是被迫代替她去往敵國和親丽涩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350