12、OC-初識內(nèi)存管理

雖然現(xiàn)在我們做開發(fā)走到使用ARC 自動引用計數(shù)妻味,但是更好地去了解內(nèi)存管理還是非常有必要的药蜻。
??手機的內(nèi)存是有限的瓷式,當分配的內(nèi)存講手機內(nèi)存都占用后,手機會崩潰導致手機應(yīng)用崩潰语泽,所以贸典,我門需要合理地釋放手機內(nèi)存來保證手機應(yīng)用不會崩潰。
??比如我們創(chuàng)建了一個類踱卵,在類中創(chuàng)建了一個 lisi 的對象廊驼,這樣逗需要給這個對象分配內(nèi)存,分配好內(nèi)存之后惋砂,就會使用它的內(nèi)存妒挎,為了保證內(nèi)存空間有良好的持續(xù)實用性,我們需要在 lisi這個對象使用完畢后西饵,釋放它所占用的內(nèi)存饥漫,我們可以看如下的代碼演示來說明:

BLPerson *lisi = [[BLPerson alloc] initWithName:@"lisi" age:30];
[lisi sayMyInfo];
[lisi setName:@"李斯"];
[lisi setAge:90];

NSString *lisiName = [lisi name];
NSInteger lisiAge = [lisi age];
NSLog(@"lisiName: %@, lisiAge: %li", lisiName, lisiAge);

[lisi release];            //  這樣還不等于釋放了 lisi,這樣僅僅代表對象 lisi 的引用計數(shù) 減去了 1個罗标,
                           //   如果 lisi 本身沒有再被其他對象所引用的話(引用計數(shù)為0),則 對象 lisi 會被釋放积蜻,
                           //   不然代表它還有別的擁有者闯割,不會被釋放。

內(nèi)存機制其時就是引用計數(shù)的機制竿拆。當對象的引用計數(shù)為零的時候宙拉,就會由系統(tǒng)去調(diào)用與 alloc 相反的函數(shù),即 dealloc 函數(shù)丙笋,去釋放內(nèi)存谢澈。并且當你使用了 alloc, copy, retain 的話都要對應(yīng)的使用一個 release(保持平衡御板,保證不用的時候锥忿,引用計數(shù)最后為0)。

#import "BLPerson.h"

@implementation BLPerson

- (void)dealloc
{
    self.name = nil;
    [super dealloc];     // 這行代碼在 dealloc 中一定要寫怠肋,還得放在最后敬鬓。父類需要被釋放。
}

比如你在類文件中聲明了一個類方法+(instance) ,在別的文件中調(diào)用這個方法钉答,當使用完之后础芍,你希望可以釋放它,那么直接在下面 release是否合適呢数尿?其實仑性,這樣是不合適有問題的。因為有時候右蹦,你調(diào)用的是網(wǎng)上的SDK诊杆,你不知道在你調(diào)用的文件里面,它是否已經(jīng)進行了釋放的操作嫩实。一旦在你調(diào)用的SDK中刽辙,它已經(jīng)做了釋放的代碼輸入,而你又在自己的文件中進行了 release 的操作甲献,這樣 引用計數(shù)在0的情況下又要減去1宰缤,這樣就叫做非法訪問,也會造成系統(tǒng)崩潰晃洒,那么我們應(yīng)該怎么做呢慨灭?這時候就需要引入 autorelease 方法,即在類文件中 最后 return 某個類的時候球及,比如一個BLPerson 類氧骤,應(yīng)該寫成 return [person autorelease];
??或者這樣,也可以:

+ (BLPerson *)createPerson
{
    BLPerson *person = [[[BLPerson alloc] initWithName:@"未設(shè)置" age:0] autorelease];
    return person;
}

這個是自動釋放池吃引,當系統(tǒng)發(fā)現(xiàn)這個內(nèi)存不再被使用的時候筹陵,會自動對在自動釋放池中的對象 引用對象 -1。


以上內(nèi)容是在使用MRC 手動引用管理的時代需要注意的內(nèi)容(可以在項目工程 的設(shè)置中進行設(shè)置镊尺,從 ARC 轉(zhuǎn)為 MRC)朦佩。

mrc設(shè)置.jpg

??有兩個最常見的應(yīng)用崩潰現(xiàn)象:數(shù)組越界 和 非法訪問(內(nèi)存已經(jīng)釋放,地址值還在并訪問)庐氮。(weak 比 assign 要安全语稠,前者會將地址值改變?yōu)?xo,訪問后是安全的弄砍,不會造成非法訪問仙畦。后者做不到這樣)
??注意當在頭文件中聲明了某個方法,也需要在實現(xiàn)文件中去實現(xiàn)音婶,不然雖然可以調(diào)用慨畸,但用戶使用的時候?qū)嶋H上是會造成崩潰(閃退)的(如果這個方法在父類中實現(xiàn)了,它就不會崩潰)衣式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末先口,一起剝皮案震驚了整個濱河市型奥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碉京,老刑警劉巖厢汹,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谐宙,居然都是意外死亡烫葬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門凡蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搭综,“玉大人,你說我怎么就攤上這事划栓《医恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵忠荞,是天一觀的道長蒋歌。 經(jīng)常有香客問我,道長委煤,這世上最難降的妖魔是什么堂油? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮碧绞,結(jié)果婚禮上府框,老公的妹妹穿的比我還像新娘。我一直安慰自己讥邻,他們只是感情好迫靖,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兴使,像睡著了一般袜香。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲫惶,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音实抡,去河邊找鬼欠母。 笑死,一個胖子當著我的面吹牛吆寨,可吹牛的內(nèi)容都是我干的赏淌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啄清,長吁一口氣:“原來是場噩夢啊……” “哼六水!你這毒婦竟也來了俺孙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掷贾,失蹤者是張志新(化名)和其女友劉穎睛榄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體想帅,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡场靴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了港准。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨剥。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浅缸,靈堂內(nèi)的尸體忽然破棺而出轨帜,到底是詐尸還是另有隱情,我是刑警寧澤衩椒,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布蚌父,位于F島的核電站,受9級特大地震影響烟具,放射性物質(zhì)發(fā)生泄漏梢什。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一朝聋、第九天 我趴在偏房一處隱蔽的房頂上張望嗡午。 院中可真熱鬧,春花似錦冀痕、人聲如沸荔睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僻他。三九已至,卻和暖如春腊尚,著一層夾襖步出監(jiān)牢的瞬間吨拗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工婿斥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劝篷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓民宿,卻偏偏與公主長得像娇妓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子活鹰,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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

  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存哈恰,也就是說只估,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,497評論 1 3
  • 內(nèi)存管理是程序在運行時分配內(nèi)存、使用內(nèi)存着绷,并在程序完成時釋放內(nèi)存的過程蛔钙。在Objective-C中,也被看作是在眾...
    蹲瓜閱讀 3,101評論 1 8
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機制蓬戚。與retain配對使用的方法是dealloc還是release夸楣,為什么?需要與a...
    丶逐漸閱讀 1,971評論 1 16
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運行時分配內(nèi)存(比如創(chuàng)建一個對象,會增加內(nèi)存占用)與...
    蚊香醬閱讀 5,728評論 8 119
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,160評論 30 470