OC內(nèi)存管理機(jī)制

一.基本原理

為什么要進(jìn)行內(nèi)存管理?

由于移動(dòng)設(shè)備的內(nèi)存有限,所以每個(gè)App所占的內(nèi)存空間也是有限的,當(dāng)App所占用的內(nèi)存較多時(shí),系統(tǒng)就會(huì)發(fā)出內(nèi)存警告,,為了節(jié)省內(nèi)存的使用

當(dāng)對象不再使用內(nèi)存時(shí),需要及時(shí)的對內(nèi)存進(jìn)行回收

管理范圍:任何繼承與NSObject的對象,對其他的基本數(shù)據(jù)類型無效.

對象的基本結(jié)構(gòu):

引用計(jì)數(shù)器:用來保存當(dāng)前對象,有幾個(gè)東西在使用(數(shù)字);

引用計(jì)數(shù)器的作用:用來判斷對象是否應(yīng)該回收內(nèi)存空間,當(dāng)引用計(jì)數(shù)器為0時(shí),此時(shí)需要回收對象的內(nèi)存空間

引用計(jì)數(shù)器的操作:

retain: 引用計(jì)數(shù)器 +1
release: 引用計(jì)數(shù)器 -1

retainCount:得到引用計(jì)數(shù)器的值

對象銷毀

當(dāng)一個(gè)對象的引用計(jì)數(shù)器為0時(shí)乖坠,那么它將被銷毀迫像,其占用的內(nèi)存被系統(tǒng)回收

當(dāng)對象被銷毀時(shí)坦冠,系統(tǒng)會(huì)自動(dòng)向?qū)ο蟀l(fā)送一條dealloc消息算吩,一般會(huì)重寫dealloc方法,在這里釋放相關(guān)的資源岁钓,dealloc就像是對象的“臨終遺言”升略。一旦重寫了dealloc方法就必須調(diào)用[super dealloc],并且放在代碼塊的最后調(diào)用(不能直接調(diào)用dealloc方法)
一旦對象被回收了屡限,那么他所占據(jù)的存儲(chǔ)空間就不再可用降宅,堅(jiān)持使用會(huì)導(dǎo)致程序崩潰(野指針錯(cuò)誤)

內(nèi)存管理原則

(一)原則
只要還有人在使用某個(gè)對象,那么這個(gè)對象就不會(huì)被回收囚霸;
只要你想使用這個(gè)對象,那么就應(yīng)該讓這個(gè)對象的引用計(jì)數(shù)器+1激才;
當(dāng)你不想使用這個(gè)對象時(shí)拓型,應(yīng)該讓對象的引用計(jì)數(shù)器-1;
(二)誰創(chuàng)建瘸恼,誰release
(1)如果你通過alloc,new,copy來創(chuàng)建了一個(gè)對象劣挫,那么你就必須調(diào)用release或者autorelease方法
(2)不是你創(chuàng)建的就不用你去負(fù)責(zé)
(三)誰retain,誰release
只要你調(diào)用了retain东帅,無論這個(gè)對象時(shí)如何生成的压固,你都要調(diào)用release

Autorelease

#pragma mark ----- autorelease ------
        
        //創(chuàng)建對象后,如果想讓對象在出自動(dòng)釋放池的時(shí)候,調(diào)用dealloc方法,那么需要在后面加上autorelease;
        //Person *person = [[Person new] autorelease];//引用計(jì)數(shù)1
        
        
        //此時(shí)person的引用計(jì)數(shù)為0,會(huì)調(diào)用dealloc方法
        //[person release];
//        
//        Person *person = [Person new];
//        //此處autorelease是標(biāo)記釋放 并不是真正的釋放,后面仍然可以正常使用對象,一直到autorelease花括號(hào)結(jié)束處,會(huì)調(diào)用dealloc方法
//        [person autorelease];
//        //不建議,過度釋放
//        [person autorelease];

自動(dòng)釋放池創(chuàng)建及簡單使用

NSAutoreleasePool *pool = [NSAutoreleasePool new];//@autoreleasepool{
//        
//        Person *per2 = [Person new];
//        [per2 retain];
//        
//        //使用屬性的set方法賦值
//        per2.name = @"大桶";
//        
//        //使用KVC方法賦值
//        [per2 setValue:@20  forKey:@"age"];
//        
//        NSLog(@"%@",per2.name);
//        NSLog(@"%@",[per2 valueForKey:@"age"]);
//        
//        
//        
//        
//        
//        [per2 release];
//        
//        [per2 release];
//        
//        [pool release];//}
        
        //自動(dòng)釋放池嵌套使用
//        @autoreleasepool {
//            Person *per4 = [[Person new] autorelease];
//        }


ARC內(nèi)存管理機(jī)制

(一)ARC的判斷準(zhǔn)則:
只要沒有強(qiáng)指針指向?qū)ο螅瑢ο缶蜁?huì)被釋放靠闭。
(二)指針分類:
(1)強(qiáng)指針:默認(rèn)的情況下帐我,所有的指針都是強(qiáng)指針,關(guān)鍵字strong
(2)弱指針:__weak關(guān)鍵字修飾的指針
聲明一個(gè)弱指針如下:
__weak Person *p;
ARC中愧膀,只要弱指針指向的對象不在了拦键,就直接把弱指針做清空操作。
weak Person *p=[[Person alloc] init];//不合理檩淋,對象一創(chuàng)建出來就被釋放掉芬为,對象釋放掉后,ARC把指針自動(dòng)清零
ARC中在property處不再使用retain,而是使用strong蟀悦,在dealloc中不需要再[super dealloc]媚朦。
@property(nonatomic,strong)Dog *dog;// 意味著生成的成員變量dog是一個(gè)強(qiáng)指針,相當(dāng)于以前的retain日戈。
如果換成是弱指針询张,則換成weak,不需要加

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浙炼,一起剝皮案震驚了整個(gè)濱河市瑞侮,隨后出現(xiàn)的幾起案子的圆,更是在濱河造成了極大的恐慌,老刑警劉巖半火,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件越妈,死亡現(xiàn)場離奇詭異,居然都是意外死亡钮糖,警方通過查閱死者的電腦和手機(jī)梅掠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來店归,“玉大人阎抒,你說我怎么就攤上這事∠矗” “怎么了且叁?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秩伞。 經(jīng)常有香客問我逞带,道長,這世上最難降的妖魔是什么纱新? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任展氓,我火速辦了婚禮,結(jié)果婚禮上脸爱,老公的妹妹穿的比我還像新娘遇汞。我一直安慰自己,他們只是感情好簿废,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布空入。 她就那樣靜靜地躺著,像睡著了一般族檬。 火紅的嫁衣襯著肌膚如雪执庐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天导梆,我揣著相機(jī)與錄音轨淌,去河邊找鬼。 笑死看尼,一個(gè)胖子當(dāng)著我的面吹牛递鹉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藏斩,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躏结,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狰域?” 一聲冷哼從身側(cè)響起媳拴,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黄橘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屈溉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塞关,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年子巾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帆赢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡线梗,死狀恐怖椰于,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仪搔,我是刑警寧澤瘾婿,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站烤咧,受9級特大地震影響偏陪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜髓削,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镀娶。 院中可真熱鬧立膛,春花似錦、人聲如沸梯码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轩娶。三九已至儿奶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳄抒,已是汗流浹背闯捎。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留许溅,地道東北人瓤鼻。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像贤重,于是被迫代替她去往敵國和親茬祷。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • 手機(jī)平臺(tái)不同于計(jì)算機(jī)并蝗,由于手機(jī)硬件的局限性祭犯,如果不好好管理內(nèi)存秸妥,會(huì)出現(xiàn)很多問題的! http://www.jian...
    js_2013閱讀 821評論 0 3
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機(jī)制沃粗。與retain配對使用的方法是dealloc還是release粥惧,為什么?需要與a...
    丶逐漸閱讀 1,964評論 1 16
  • 29.理解引用計(jì)數(shù) Objective-C語言使用引用計(jì)數(shù)來管理內(nèi)存陪每,也就是說影晓,每個(gè)對象都有個(gè)可以遞增或遞減的計(jì)數(shù)...
    Code_Ninja閱讀 1,490評論 1 3
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,723評論 8 119
  • 嗯挂签,某天聽到有人聊前任,悲憤而充滿著恨意盼产,說:“真恨他饵婆,希望他永遠(yuǎn)都結(jié)不了婚”。兩個(gè)憤憤的女人戏售,各自訴說著前任的種...
    女子愛紅妝閱讀 264評論 0 0