多个对象的内存管理
2016-01-09 本文已影响17人
MarkTang
只要一个对象要向使用另外一个对象 就加一
不用就减一
set方法内存管理
#import <Foundation/Foundation.h>
#import "Room.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc]init];
Room *r = [[Room alloc]init];
r.no = 444;
[p setRoom:r];
//需要换房间
Room *r2 = [[Room alloc]init];
r.no = 888;
[p setRoom:r2];
//需要再次换回房间
Room *r3 = [[Room alloc]init];
r.no = 444;
[p setRoom:r3];
[p release];
[r release];
}
return 0;
}
#import <Foundation/Foundation.h>
#import "Room.h"
@interface Person : NSObject
{
Room * _room;
}
-(void)setRoom:(Room *)room;
-(Room *)room;
@end
#import "Person.h"
@implementation Person
-(void)setRoom:(Room *)room{
//1.判断传进来的对象是否和上次相同
if (_room!=room) {
//2.把属性的对象release一次,把上次的对象清除
[_room release];
//3.把传进来的属性加reatin一次,因为在人最后释放的时候要释放房间对象
[room retain];
//4.把新传来的值赋值给属性
_room = room;
}
//如果是相同的就什么事情也不干,因为第一进来指针是空的也不会相同,第二次如果进来和第一次一样就不需要操作
}
-(Room *)room
{
return _room;
}
- (void)dealloc{
//人释放的时候房间也要释放
[_room release];
NSLog(@"%s",__func__);
[super dealloc];
}
@end
#import <Foundation/Foundation.h>
@interface Room : NSObject
@property int no;
@end
@implementation Room
- (void)dealloc
{
NSLog(@"%s no=%i",__func__,_no);
[super dealloc];
}
@end
//问题:内存管理的原则?
答:
有加就有减
1.谁创建谁release
如果你通过alloc、new、copy或mutableCopy来创建一个对象,那么你必须调用release或autorelease
2.谁retain谁release:
只要你调用了retain,就必须调用一次release
3.总结:
有加就有减,曾经让对象的计数器+1,就必须在最后让对象的计数器-1
-------------------------------------------------------------------
#mark- 06-set方法内存管理
"理解set方法内存管理的推导过程,推导过程不需要记,只需要记忆结论就可以"
//问题1:实现set方法内存管理有哪几步?
答:
1. 判断传进来的对象是偶和上次相同
2.把属性的对象release一次,把上次的对象清除
3.把穿竟来的属性加reatin一次i在人在最后释放的时候释放房间对象
4.把新传来的值赋值给属性
1.判断传入的对象是否是以前的对象
2.release旧对象
3.retain新对象
4.将传入的对象赋值给成员变量
- (void)setRoom:(Room *)room
{
// 1.只有房间不同才需用release和retain
if (_room != room) {// 0ffe1 != 0ffe1
// 2.将以前的房间释放掉 -1
[_room release];
/*
// 3.对房间的引用计数器+1
[room retain];
//4.将新房间赋值给实例变量
_room = room;
*/
// retain不仅仅会对引用计数器+1, 而且还会返回当前对象
_room = [room retain];
}
}