//  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,需要手动加1,不然不会自动加1,多次相同的set就会加多次
    [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;
        
        // 将房间赋值给人
        // 不是方法的调用,调用是[],点语法,调用set,get方法,会多次加1,需要手动将计数器加1,不然引用不会自动加1
        p.room = r; // [p setRoom:r]
     p.room = r;
p.room = r; p.room = r;
[r release];
// 在这行代码之前, 人都没有被释放 NSLog(@"-----"); // 人都不在了, 房间也必须销毁 [p release]; } return 0; }