美文网首页
OC语言day05-06set方法内存管理

OC语言day05-06set方法内存管理

作者: liyuhong165 | 来源:发表于2016-06-05 22:29 被阅读47次

    pragma mark set方法内存管理

    pragma mark 概念

    pragma mark 代码

    #import <Foundation/Foundation.h>
    #pragma mark 类
    #import "Person.h"
    #import "Room.h"
    #pragma mark main函数
    int main(int argc, const char * argv[])
    {
        
        @autoreleasepool {
            // 1. 创建两个对象
            Person *p = [[Person alloc]init];
            Room *r = [[Room alloc]init];
            r.no = 888;
            
            // 2.将房间赋值给人
            // 人需要使用 这间房, 只要人在 房间就一定要在
            p.room = r;
            
            [r release];
            
            
            // 3. 换房
            /*
            Room *r2 = [[Room alloc]init];
            r2.no = 444;
            p.room = r2; // (换房的时候 有问题)
            [r2 release];
            */
            p.room = r;
            
    #warning 这里出现bug 人在房间都应该在的,但是这里房间已经被销毁了
            // 在这行代码之前, 人都没有被释放
            NSLog(@"-------");
            
            
            // 人都不在了,房间也必须销毁了
            [p release];
        }
        return 0;
    }
    
    
    

    Person.h //人类
    #import <Foundation/Foundation.h>
    
    #import "Room.h"
    @interface Person : NSObject
    {
        Room *_room;
    }
    
    - (void)setRoom:(Room *)room;
    - (Room *)room;
    
    @end
    
    Person.m
    #import "Person.h"
    
    @implementation Person
    
    
    #warning 当A对象 想 使用B对象, 一定要对B对象 进行一次retain, 这样才能保证A对象存在 B对象就存在, 也就是说这样才能保证无论 在什么时候 在A对象中都可以使用B对象
    // 当A对象 释放的时候, 一定要对B 对应进行一次release, 这样才能保证 A 对象释放了, B 对象对应 也会随之释放, 避免内存泄漏
    // 总结 一句话 : 有增就有减
    //
    - (void)setRoom:(Room *)room  // room = r
    {
    #warning ⚠️(重点) 每次换房的时候 将以前的房间 释放掉 -1 
    //    [_room release];
    #warning 👍(重点修改) 每次换房的时候 《只有房间不同才需要》 将以前的房间 释放掉 -1
        // 如果当前的房间 不等于 传递进来的房间 才需要做操作
        // 只有房间不同 才需要 release 和 retain
        if(_room != room)
        {
            // nil != 0ffc8
            [_room release];
            
            /*
            // 应该对 房间类 的引用计数器+1
            [room retain];
            
            _room = room;
             */
    #warning 优化
            // retain 不仅仅会对引用计数器+1,而且还会返回当前对象
            _room = [room retain];
        }
    }
    
    - (Room *)room
    {
        return _room;
    }
    
    - (void)dealloc
    {
    #warning 人释放了 ,房间也需要释放
        [_room release];    
        NSLog(@"%s",__func__);
        [super dealloc];
    }
    @end
    

    Room.h //房间类
    #import <Foundation/Foundation.h>
    
    @interface Room : NSObject
    
    @property int no; // 房间号
    
    @end
    
    Room.m
    #import "Room.h"
    
    @implementation Room
    - (void)dealloc
    {
        NSLog(@"%s no = %i",__func__, _no);
        [super dealloc];
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:OC语言day05-06set方法内存管理

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