[iOS] ARC下系統(tǒng)的內(nèi)存管理策略

一.寫在前面的話

今天在寫代碼的過程中意外的見到了奇怪的現(xiàn)象岳遥,經(jīng)過深層的剖析發(fā)現(xiàn)這一部分知識還很有用未荒,所以就寫了一篇文章來記錄哩罪。

二.代碼演示

1.有如下視圖控制器

#import "ViewController.h"
#import "Student.h"

@interface ViewController ()

/*
這是一個(gè)學(xué)生的對象 用assign修飾 = = 
實(shí)際開發(fā)中不建議用assign修飾對象
這么做的目的 是為了觀察對象是否被釋放
*/
@property (nonatomic, assign) Student *student;
@end

@implementation ViewController

//控制器中有個(gè)按鈕  按鈕點(diǎn)擊后就會執(zhí)行該方法
- (IBAction)buttonAction:(id)sender {
    //點(diǎn)擊按鈕執(zhí)行方法
    //讓學(xué)生學(xué)習(xí)
    [self.student study];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

2.在ViewDidLoad中執(zhí)行 代碼1

    self.student = [[Student alloc] init];
    [self.student study];

執(zhí)行結(jié)果1

代碼1執(zhí)行結(jié)果

3.在ViewDidLoad中執(zhí)行 代碼2

Student *student = [[Student alloc] init];
self.student = student;
[student study];

執(zhí)行結(jié)果2

代碼2

4.點(diǎn)擊按鈕 引發(fā)崩潰

點(diǎn)擊按鈕崩潰

三.引出問題

為什么兩個(gè)代碼中的student都是用assign修飾呀狼,而執(zhí)行結(jié)果卻一個(gè)崩潰一個(gè)順利執(zhí)行了呢等曼?

看到這里如果知道答案的朋友有兩個(gè)選擇里烦,如果覺得這是個(gè)低級問題或沒有用直接點(diǎn)擊瀏覽器左上角關(guān)閉,如果覺得還有點(diǎn)看頭就請繼續(xù)禁谦,如果文章有錯(cuò)誤給您造成不良反應(yīng)本人概不負(fù)責(zé) = =

四.揭曉答案

本人特別不喜歡賣關(guān)子胁黑,我的博客重來不進(jìn)行探究猜測直接揭曉我的結(jié)論

1.為什么一個(gè)崩潰 一個(gè)順利執(zhí)行

因?yàn)?code>代碼1中的student在執(zhí)行study方法前就被釋放了,原因是assign在對象釋放后不會對指針做任何處理州泊,所以當(dāng)對象釋放了這個(gè)指針就是野指針丧蘸,向野指針發(fā)送消息必然崩潰,代碼2中的對象為什么沒有崩潰呢拥诡,原因很簡單触趴,它執(zhí)行方法的時(shí)候?qū)ο蟛]有被釋放氮发,點(diǎn)擊按鈕后為什么會崩潰,原因很簡單冗懦,因?yàn)閷ο笤邳c(diǎn)擊按鈕之前已經(jīng)釋放了爽冕。

2.為什么代碼1中對象會被提前釋放

答案其實(shí)很簡單,這是ARC處理的潛規(guī)則披蕉,如果[[Student alloc] init]前面是一個(gè)用assign修飾的屬性self.student颈畸,就會發(fā)生接收后立即被釋放的情況,但如前面是 Student * student就不會立刻被釋放没讲,而是出作用域后被釋放眯娱,而作用域即為ViewDidLoad方法,出了這個(gè)方法就會被釋放爬凑。

3.ARC中代碼做了哪些操作讓對象釋放呢

這里復(fù)習(xí)一下ARC的原理徙缴,即編譯器會在編譯過程中自動(dòng)向代碼中插入release和autorelease等語句,自動(dòng)管理對象的內(nèi)存嘁信, 這里說明一下release的作用是讓對象引用計(jì)數(shù)-1于样,而autorelease的作用是當(dāng)對象出自動(dòng)釋放池或作用域時(shí)讓對象引用計(jì)數(shù)-1,當(dāng)對象引用計(jì)數(shù)為0時(shí)潘靖,就會調(diào)用對象本身的dealloc方法釋放內(nèi)存穿剖。

為了證明這一觀點(diǎn),我們切換到MRC模式下進(jìn)行代碼演示

代碼1中系統(tǒng)做的操作是

self.student = [[Student alloc] init];
[self.student release];
[self.student study];

執(zhí)行結(jié)果是:

執(zhí)行結(jié)果1

與代碼1中崩潰信息一致 即向野指針發(fā)送消息程序崩潰

代碼2中系統(tǒng)所做的操作是

Student *student = [[Student alloc] init];
[student autorelease];
self.student = student;
[student study];

執(zhí)行結(jié)果是:

執(zhí)行結(jié)果2

點(diǎn)擊按鈕后發(fā)生崩潰

點(diǎn)擊按鈕崩潰

這與代碼2中的現(xiàn)象一樣卦溢,所以可以證實(shí)我的結(jié)論是正確的

以上觀點(diǎn)為個(gè)人推理所得糊余,如果有任何疑問或發(fā)現(xiàn)了錯(cuò)誤,請及時(shí)與我聯(lián)系单寂,歡迎朋友們積極踴躍糾正我的錯(cuò)誤贬芥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凄贩,隨后出現(xiàn)的幾起案子誓军,更是在濱河造成了極大的恐慌,老刑警劉巖疲扎,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昵时,死亡現(xiàn)場離奇詭異,居然都是意外死亡椒丧,警方通過查閱死者的電腦和手機(jī)壹甥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壶熏,“玉大人句柠,你說我怎么就攤上這事。” “怎么了溯职?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵精盅,是天一觀的道長。 經(jīng)常有香客問我谜酒,道長叹俏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任僻族,我火速辦了婚禮粘驰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘述么。我一直安慰自己蝌数,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布度秘。 她就那樣靜靜地躺著顶伞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剑梳。 梳的紋絲不亂的頭發(fā)上枝哄,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音阻荒,去河邊找鬼。 笑死众羡,一個(gè)胖子當(dāng)著我的面吹牛侨赡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粱侣,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼羊壹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齐婴?” 一聲冷哼從身側(cè)響起油猫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柠偶,沒想到半個(gè)月后情妖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诱担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年毡证,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫仙。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡料睛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恤煞,我是刑警寧澤屎勘,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站居扒,受9級特大地震影響概漱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苔货,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一犀概、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夜惭,春花似錦姻灶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敢会,卻和暖如春曾沈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸥昏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工塞俱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吏垮。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓障涯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膳汪。 傳聞我的和親對象是個(gè)殘疾皇子唯蝶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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