單個對象的內存管理非常簡單無非就是alloc對應release,retain對應release。但是如果涉及到很多對象,而且對象與對象有聯系的時候該怎么去管理對象的內存呢。
比如同樣一本書有好3個人購買,那意味著3個人都在引用這本書。在內存中如圖所示:

那么如果Person對象引用Book對象的話就必須給Book對象的引用計數+1,如果不再引用Book對象就要把Book對象中的引用計數減1。遵循"有加必有減"
1.多對象內存管理原則分析
2.誰創建誰release
如果通過alloc、new或[mutable]copy來創建一個對象,那么必須調用release或autorelease
換句話說,不是你創建的,就不用你去[auto]release
3.誰retain誰release
只要你調用了retain,無論這個對象是如何生成的,你都要調用release
4.總結原則
5.代碼實現
/* 需求:有連個類Person類和Book類,實現讓Person類獲取到Book,也就是人要獲取書; 如果Person類對象釋放那么Book類對象也必須釋放,也就是說一旦人沒了,書也就沒了 設計類:既然人要占有書,那么可以在人中包含一個書類型,然后讓實際的書給人中的書賦值那么人就擁有書了 */
內存結構如圖:

代碼實現:
/********************************** Person.h文件 *********************************/#import "Book.h"#import <Foundation/Foundation.h>@interface Person : NSObject{ // 既然人要擁又書,那么在Person類定義一個Book類型的成員變量 _book Book *_book;}// @PRoperty會隱藏底層內存管理 因此先不使用@property便于查看底層實現// @property Book *book;// 通過set方法為Person中的_book傳入實際的book- (void)setBook:(Book *)book;- (Book *)book;@end/********************************** Person.m文件 *********************************/#import "Person.h"@implementation Person// 為Person中的_book傳入Book對象 類似于給了Person中的_book給了一本書- (void)setBook:(Book *)book{ // 既然人已經擁有了書 那么書的引用計數必須+1 因此調用書的retain方法 _book = [book retain]; NSLog(@"人擁有書了");}- (Book *)book{ return _book;}// Person類對象在回收前調用方法- (void)dealloc{ [_book release]; NSLog(@"Person對象被回收"); [super dealloc];}@end/********************************** Book.h文件 *********************************/#import <Foundation/Foundation.h>@interface Book : NSObject@end/********************************** Book.m文件 *********************************/#import "Book.h"@implementation Book// Book類對象在回收前調用方法- (void)dealloc{ NSLog(@"Book對象被回收"); [super dealloc];}@end/********************************** main文件 *************************************/#import <Foundation/Foundation.h>#import "Book.h"#import "Person.h"int main(int argc, const char * argv[]){ Person *p = [[Person alloc] init]; Book *b = [[Book alloc] init]; // 為Person類對象中的_book傳入實際的Book對象 [p setBook:b]; // 釋放Person類對象 [p release]; // 既然Person類對象已經釋放那么清除掉指向Person類對象的指針 p = nil; // 既然Person類已經不可用了那么Book類對象也應該釋放 [b release]; // 清空指向Book類對象的指針 b = nil; return 0;}
新聞熱點
疑難解答