天天看點

OC 多個對象之間的記憶體管理

記憶體管理原則

1, 誰建立誰釋放     通過 alloc, new 或[auto]copy建立的對象,所必須對應的引用一次 release 或autorelease來釋放 2, 誰retain, 誰release     隻要retain, 那麼在不需要時就要調用一次release

示例代碼

//
//  Book.h
//  多個對象之間的記憶體管理
//
//  Created by LiuWei on 15/4/16.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Book : NSObject
{
    int _price;
}

- (void)setPrice: (int)price;

- (int)price;

@end
           
//
//  Book.m
//  多個對象之間的記憶體管理
//
//  Created by LiuWei on 15/4/16.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import "Book.h"

@implementation Book
- (void)setPrice:(int)price
{
    _price = price;
}

- (int)price
{
    return _price;
}

- (void)dealloc
{
    NSLog(@"%@對象被回收", self);
    [super dealloc];
}
@end
           
//
//  Person.h
//  多個對象之間的記憶體管理
//
//  Created by LiuWei on 15/4/16.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Book.h"

@interface Person : NSObject
{
    Book *_book;
}

- (void)setBook:(Book*)book;

- (Book*)book;

@end
           
//
//  Person.m
//  多個對象之間的記憶體管理
//
//  Created by LiuWei on 15/4/16.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)setBook:(Book *)book
{
    [book retain]; // 引用了Book對象 是以Book對象引用計數加 1
    _book = book;
}

- (Book *)book
{
    return _book;
}

- (void)dealloc
{
    NSLog(@"%@被回收, 所引用book對象 %@引用計數減1", self, _book);
    
    [_book release]; // 釋放peron中的資源, 說明所引用的Book對象不再使用,是以使Book引用計數 -1;
    _book = nil;
    
    [super dealloc];
}

@end
           
//
//  main.m
//  多個對象之間的記憶體管理
//
//  Created by LiuWei on 15/4/16.
//  Copyright (c) 2015年 LiuWei. All rights reserved.
//

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

int main()
{
    Book *b = [[Book alloc]init];
    b.price = 22;
    NSLog(@"b 的引用計數為: %ld", [b retainCount]); // 預設引用計數為 1
    
    Person *LiLei = [[Person alloc]init];
    LiLei.book = b;
    NSLog(@"b 的引用計數為: %ld", [b retainCount]); // LiLei引用了Book對象b , 此時b引用計數應為 2
    
    Person *LiuMin = [[Person alloc]init];
    LiuMin.book = b;
    NSLog(@"b 的引用計數為: %ld", [b retainCount]); // LiuMin引用了Book對象b , 此時b引用計數應為 3
    
    
    [LiuMin release];
    NSLog(@"b 的引用計數為: %ld", [b retainCount]); // LiuMin資源被釋放,是以所引用的Book對象b引用計數應減1, 為2
    
    [LiLei release];
    NSLog(@"b 的引用計數為: %ld", [b retainCount]); // LiLei資源被釋放,是以所引用的Book對象b引用計數應減1, 為1

    
    [b release];// b引用計數為0, 系統調用dealloc回收資源.
    return 0;
}
           

程式輸出結果

OC 多個對象之間的記憶體管理

繼續閱讀