码迷,mamicode.com
首页 > 其他好文 > 详细

oc44--多对象内存管理

时间:2017-08-23 18:17:23      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:return   const   turn   ase   对象   []   内存   对象内存   release   

//  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
//
//  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

// 当A对象想使用B对象一定要对B对象进行一次retain, 这样才能保证A对象存在B对象就存在, 也就是说这样才能保证无论在什么时候在A对象中都可以使用B对象
// 当A对象释放的时候, 一定要对B对象进行一次release, 这样才能保证A对象释放了, B对象也会随之释放, 避免内存泄露
// 总结一句话: 有增就有减

- (void)setRoom:(Room *)room // room = r
{
    // 对房间的引用计数器+1
    [room retain];
    _room = room;
}

- (Room *)room
{
    return  _room;
}

- (void)dealloc
{
    // 人释放了, 那么房间也需要释放
    [_room release];
    NSLog(@"%s", __func__);
    [super dealloc];   //ARC不能访问dealloc,
}
@end
//
//  main.m
//  多个对象的内存管理

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Room.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        // 1.创建两个对象
        Person *p = [[Person alloc] init];
        Room *r = [[Room alloc] init];
        r.no = 888;
        
        // 将房间赋值给人
        // 不是方法的调用,调用是[],
        p.room = r; // [p setRoom:r]
        
        [r release];
        
        // 在这行代码之前, 人都没有被释放
        NSLog(@"-----");
        
        // 人都不在了, 房间也必须销毁
        [p release];
    }
    return 0;
}

 

oc44--多对象内存管理

标签:return   const   turn   ase   对象   []   内存   对象内存   release   

原文地址:http://www.cnblogs.com/yaowen/p/7419379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!