美文网首页
多个对象的内存管理

多个对象的内存管理

作者: MarkTang | 来源:发表于2016-01-09 00:52 被阅读17次
    
    只要一个对象要向使用另外一个对象 就加一
    不用就减一
    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];
        }
    }
    

    相关文章

      网友评论

          本文标题:多个对象的内存管理

          本文链接:https://www.haomeiwen.com/subject/xvxqkttx.html