多个对象的内存管理

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];
    }
}
上一篇下一篇

猜你喜欢

热点阅读