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