1. 程式人生 > >oc44--多對象內存管理

oc44--多對象內存管理

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--多對象內存管理