記憶體管理原則
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;
}
程式輸出結果