oc44--多對象內存管理
阿新 • • 發佈:2017-08-23
port pro 也會 兩個 retain 沒有 logs @property 進行
// 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--多對象內存管理