前言
大家好惶桐,我是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ì)釋放级零。