ios開(kāi)發(fā)基礎(chǔ)學(xué)習(xí)筆記(九)--多對(duì)象內(nèi)存管理(MRC)

前言

大家好惶桐,我是milo,上一篇講到的是關(guān)于單個(gè)對(duì)象的內(nèi)存管理潘懊,看起來(lái)是挺容易的姚糊,但是涉及到多對(duì)象并且對(duì)象之間有關(guān)聯(lián)的時(shí)候,就會(huì)顯得比較復(fù)雜授舟,所以我們就接下去看看多對(duì)象內(nèi)存的管理救恨。

多對(duì)象內(nèi)存管理

大家應(yīng)該都知道QQ游戲的斗地主吧,其實(shí)多個(gè)對(duì)象的內(nèi)存管理跟很多游戲的房間管理差不多岂却。

為了更加具體忿薇,下面我們通過(guò)代碼的方式實(shí)現(xiàn)多對(duì)象的內(nèi)存管理裙椭。

上代碼之前,一定要對(duì)下面幾條規(guī)范心中有數(shù)署浩。
1揉燃、只要還有人在用某個(gè)對(duì)象,那么這個(gè)對(duì)象就不會(huì)被回收
2筋栋、只要你想用這個(gè)對(duì)象炊汤,就讓對(duì)象的計(jì)數(shù)器+1
3、當(dāng)你不再使用這個(gè)對(duì)象時(shí)弊攘,就讓對(duì)象的計(jì)數(shù)器-1
4抢腐、誰(shuí)retain誰(shuí)release :只要你調(diào)用了retain,就必須調(diào)用一次release

當(dāng)我們寫(xiě)代碼的時(shí)候就得按照上面這樣的規(guī)范去實(shí)現(xiàn)襟交。

那么直接看下面見(jiàn)代碼:

JJRoom.h(啥也沒(méi)有迈倍。。捣域。)

#import <Foundation/Foundation.h>

@interface JJRoom : NSObject

@end

JJRoom.m

#import "JJRoom.h"

@implementation JJRoom

- (void)dealloc {
    
    NSLog(@"Room 被釋放了");
    [super dealloc];
}

@end

重寫(xiě)下dealloc 方法啼染,當(dāng)JJRoom對(duì)象回收的時(shí)候打印一下。

JJPerson.h

#import <Foundation/Foundation.h>
#import "JJRoom.h"

@interface JJPerson : NSObject {  
  JJRoom *_room;
}

- (void)setRoom: (JJRoom *)room;

@end

JJPerson有一個(gè)JJRoom類(lèi)型的成員變量焕梅,以及自定義的setRoom方法(為了管理成員變量_room的內(nèi)存)

JJPerson.m

#import "JJPerson.h"

@implementation JJPerson 


-(void)setRoom:(JJRoom *)room {
//    初始化的時(shí)候_room = nil
    if (_room != room ) {//    必須所指的對(duì)象不同才能進(jìn)入迹鹅,不然就會(huì)被釋放掉
        [_room release];//    把“舊房間“釋放掉
        _room = [room retain];//     “新房間“計(jì)數(shù)+1,并賦值給成員變量
    }
    
}

-(void)dealloc {
    
    [_room release];//   釋放掉成員變量
    _room = nil;//    把野指針置空
    
    NSLog(@"Person 被釋放了");
    [super dealloc];
}

@end

setRoom和dealloc為什么要如此設(shè)計(jì)贞言,要參照下面的main.m程序進(jìn)行理解斜棚。

main.m(注意:我注釋后面例如person 1 則表示person引用次數(shù)為1)

#import <Foundation/Foundation.h>
#import "JJPerson.h"
#import "JJRoom.h"

int main(int argc, const char * argv[]) {
    
    JJPerson *person = [[JJPerson alloc] init];//  person 1
    
    JJRoom *room = [[JJRoom alloc] init];// room 1
    
    [person setRoom:room];// room 2
    
    [room release];// room 1
    
    
    JJRoom *room2 = [[JJRoom alloc] init];// room2 1

    [person setRoom:room2];// room 0 room2 2
    
    [room2 release];// room2 1
    
    
    
    [person release];// person 0 room 0 room2 0
    
    
    return 0;
}

經(jīng)過(guò)上面那樣setRoom和dealloc的設(shè)計(jì),我們寫(xiě)代碼的時(shí)候该窗,就只需要遵行

誰(shuí)retain誰(shuí)release :只要你調(diào)用了retain弟蚀,就必須調(diào)用一次release

的原則,就可以讓我們的程序在滿足我們的需求的同時(shí)酗失,沒(méi)有內(nèi)存泄漏的問(wèn)題粗梭。運(yùn)行main.m,打印結(jié)果:

2018-05-25 23:45:56.467271+0800 多對(duì)象內(nèi)存管理[1979:192423] Room 被釋放了
2018-05-25 23:45:56.467498+0800 多對(duì)象內(nèi)存管理[1979:192423] Room 被釋放了
2018-05-25 23:45:56.467522+0800 多對(duì)象內(nèi)存管理[1979:192423] Person 被釋放了
Program ended with exit code: 0

該釋放的都釋放了,并且使用中的對(duì)象不會(huì)釋放级零。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滞乙,隨后出現(xiàn)的幾起案子奏纪,更是在濱河造成了極大的恐慌,老刑警劉巖斩启,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序调,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兔簇,警方通過(guò)查閱死者的電腦和手機(jī)发绢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)硬耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人边酒,你說(shuō)我怎么就攤上這事经柴。” “怎么了墩朦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坯认,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我氓涣,道長(zhǎng)牛哺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任劳吠,我火速辦了婚禮引润,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痒玩。我一直安慰自己淳附,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布凰荚。 她就那樣靜靜地躺著燃观,像睡著了一般。 火紅的嫁衣襯著肌膚如雪便瑟。 梳的紋絲不亂的頭發(fā)上缆毁,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音到涂,去河邊找鬼脊框。 笑死,一個(gè)胖子當(dāng)著我的面吹牛践啄,可吹牛的內(nèi)容都是我干的浇雹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屿讽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昭灵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起伐谈,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烂完,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诵棵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抠蚣,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年履澳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘶窄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀跛。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柄冲,靈堂內(nèi)的尸體忽然破棺而出吻谋,到底是詐尸還是另有隱情,我是刑警寧澤羊初,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布滨溉,位于F島的核電站,受9級(jí)特大地震影響长赞,放射性物質(zhì)發(fā)生泄漏晦攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一得哆、第九天 我趴在偏房一處隱蔽的房頂上張望脯颜。 院中可真熱鬧,春花似錦贩据、人聲如沸栋操。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矾芙。三九已至,卻和暖如春近上,著一層夾襖步出監(jiān)牢的瞬間剔宪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工壹无, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葱绒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓斗锭,卻偏偏與公主長(zhǎng)得像地淀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岖是,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,373評(píng)論 8 265
  • 1. 內(nèi)總管理原則(引用計(jì)數(shù)) IOS的對(duì)象都繼承于NSObject, 該對(duì)象有一個(gè)方法:retainCount...
    lilinjianshu閱讀 2,156評(píng)論 0 2
  • 今天看到一篇不錯(cuò)的文章關(guān)于OC內(nèi)存管理的,轉(zhuǎn)載一下與你共享概述我們知道在程序運(yùn)行過(guò)程中要?jiǎng)?chuàng)建大量的對(duì)象帮毁,和其他高級(jí)...
    niceSYT閱讀 452評(píng)論 0 2
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release豺撑,為什么作箍?需要與a...
    丶逐漸閱讀 1,963評(píng)論 1 16
  • “你認(rèn)識(shí)高嵩嗎?”在車(chē)上前硫,許久未見(jiàn)的高中男閨蜜蒙突然問(wèn)我。 我微微愣住荧止,高嵩屹电?腦海中快速搜索這個(gè)名字阶剑,哦,高嵩啊...
    墨雨均閱讀 411評(píng)論 0 0