淺談OC內(nèi)存管理

說到OC的內(nèi)存管理, 就不得不說一說OC的內(nèi)存管理機制, OC是通過引用計數(shù), 來決定對象是否釋放, 引用計數(shù)為0, 對象對應的內(nèi)存便被釋放, 否則, 該片內(nèi)存就不會被釋放瞎惫。

本文主要大概解釋一下內(nèi)存管理的底層運行機制, 對具體源碼實現(xiàn)不做分析, 主要通過定性結論以及一些自己的小demo起到一個科普的作用, 如想深入研究, 網(wǎng)上解析源碼的博客不勝枚舉, 希望本文能在您深入研究前對您有些許幫助灼芭。

MRC時代, 程序員需要自己管理對象的引用計數(shù), 通過retain, release來控制對象的引用計數(shù), 代碼冗余不說, 釋放非自己持有的對象還會造成crash寿弱。筆者并未經(jīng)歷過MRC時代, 沒有深刻的體會, 再此不過多贅述, 下面我們聊一聊ARC下的內(nèi)存管理削葱。

隨著ARC的出現(xiàn), 隨之也出現(xiàn)了__strong, __weak指針, 那么它們又各有什么樣的作用呢?
作為一名iOS開發(fā)者, 不可能對這個問題不知道, 簡單來說, strong指針就是對一個對象持有, 使之引用計數(shù)+1, 而weak指針僅僅指向該對象, 并不持有該對象, 當該對象被釋放時, weak指針自動置為nil男图”囊桑可以看出, weak指針很安全, 至少不會非法訪問而造成crash商源。

那么, 新的問題來了, strong 和 weak關鍵字的優(yōu)化各是發(fā)生在什么時期呢?

  1. strong指針: 是在編譯階段進行處理, 實際就是編譯器給加上 retain release
  2. weak指針: 是在運行期處理, weak指針賦值的時候, 不會對該對象進行retain, 在該對象引用計數(shù)為0時, 置為 nil, 事實上是在該對象引用計數(shù)即將變?yōu)?之前將該指針置為nil(此步驟便是運行期進行處理的)
  3. weak實現(xiàn)原理: 運行時底層會維護一個離散表, 我們可以理解為類似hashMap或NSDictionary結構的東西, 存放所有weak對象的相關信息, {對象地址 : weak指針的指針(二級指針)}, 當對象即將dealloc時, 來檢查這個表, 從而改變weak指針的指向, 置為nil

這里我們可以聯(lián)想到當我們要傳一個NSError *error時, 傳的是&error, 也是一個二級指針, 只有這樣, 才能修改error指針的指向, 如果傳的是一級指針, 只能修改指針指向的那塊內(nèi)存的內(nèi)容。

結論既然已經(jīng)拋出, 我們用幾個小demo來驗證一下并加深印象, 首先先說一下大體結構: 有 FirstViewController 和 SecondViewController 兩個控制器 SecondViewController 是通過 FirstViewController modal出來的

FirstViewController 中代碼

extern id strongVc;
extern __weak id weakVc;
id strongVc = nil;
__weak id  weakVc =  nil;

- (void)touchesBegan:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s, ------------%@", __func__, strongVc); 
    // 當從SecondViewController dismiss回來后, 點擊屏幕 BAD_ACCESS 非法訪問,
    // 說明調(diào)用 dealloc, 不管有沒有強引用, 對象對應的那塊內(nèi)存都會被釋放
}

SecondViewController 中代碼

- (void)viewDidLoad {
    [super viewDidLoad];
    weakVc = self; // 給weakVc賦值
}

- (void)dealloc {
    NSLog(@"weakVc = %@", weakVc); 
    // weakVc = (null), 證明了 調(diào)用dealloc完成前, weak指針已經(jīng)被置為nil

    NSLog(@"self = %@", self); 
     // self = <SecondViewController: 0x7ffe37f0de40>**

    strongVc = self;
    // 此時使一個強指針指向 self 
}

以上注釋, 就是操作結果驻子。
此外, 我們知道ARC 不允許主動掉dealloc方法, 那么如果我們強行調(diào)用dealloc方法會怎樣呢?
在SecondViewController添加以下代碼

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self performSelector:NSSelectorFromString(@"dealloc")];
    NSLog(@"%s, ------------%@", __func__, weakVc);  // nil
    NSLog(@"%s, ------------%@", __func__, self);   // BAD_ACCESS -> crash
}

強行調(diào)用dealloc, 當訪問到self時, BAD_ACCESS 導致奔潰, 進一步證明, 只要調(diào)用dealloc方法, 會把該對象對應的那部分內(nèi)存釋放灿意。

以上, 是我一些小小的分享, 希望能讓大家大體上有個概念, 如果有興趣進一步了解, 可以研究研究《Objective-C高級編程》, 里面很細致的講解了與內(nèi)存管理的相關實現(xiàn),可以有助于我們更好地了解OC的內(nèi)存管理機制。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崇呵,一起剝皮案震驚了整個濱河市缤剧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌域慷,老刑警劉巖荒辕,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犹褒,居然都是意外死亡抵窒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門叠骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來李皇,“玉大人,你說我怎么就攤上這事宙枷〉舴浚” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵慰丛,是天一觀的道長圃阳。 經(jīng)常有香客問我,道長璧帝,這世上最難降的妖魔是什么捍岳? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上锣夹,老公的妹妹穿的比我還像新娘页徐。我一直安慰自己,他們只是感情好银萍,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布变勇。 她就那樣靜靜地躺著,像睡著了一般贴唇。 火紅的嫁衣襯著肌膚如雪搀绣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天戳气,我揣著相機與錄音链患,去河邊找鬼。 笑死瓶您,一個胖子當著我的面吹牛麻捻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呀袱,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贸毕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夜赵?” 一聲冷哼從身側響起明棍,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寇僧,沒想到半個月后摊腋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡婉宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年歌豺,在試婚紗的時候發(fā)現(xiàn)自己被綠了推穷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片心包。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馒铃,靈堂內(nèi)的尸體忽然破棺而出蟹腾,到底是詐尸還是另有隱情,我是刑警寧澤区宇,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布娃殖,位于F島的核電站,受9級特大地震影響议谷,放射性物質(zhì)發(fā)生泄漏炉爆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芬首。 院中可真熱鬧赴捞,春花似錦、人聲如沸郁稍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耀怜。三九已至恢着,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間财破,已是汗流浹背掰派。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狈究,地道東北人碗淌。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像抖锥,于是被迫代替她去往敵國和親亿眠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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