从前面的例子我们可以看出单个对象的内存管理无非就是retain和release的简单使用,因此觉得内存管理没啥难理解的。其实难点在于多个对象之间的内存管理,这篇文章就简单的解析多对象的内存管理。
1. 首先创建两个类,一个是Person 类,一个是Book类
Person.h 文件
#import <Foundation/Foundation.h>
#import "Book.h"
@interface Person : NSObject
{
Book *_book;
}
-(void)setBook:(Book *)book;
-(Book *)book;
@end
Person.m 文件
#import "Person.h"
@implementation Person
-(void)setBook:(Book *)book{
_book = [book retain];
}
-(Book *)book{
return _book;
}
-(void)dealloc{
[_book release];
[super dealloc];
NSLog(@"---person释放了-");
}
@end
Book.h 文件
#import <Foundation/Foundation.h>
@interface Book : NSObject
{
int _price;
}
-(void)setPrice:(int)price;
-(int)price;
@end
Book.m 文件
#import "Book.h"
@implementation Book
-(void)setPrice:(int)price{
_price = price;
}
-(int)price{
return _price;
}
-(void)dealloc{
NSLog(@"book释放了-----");
[super dealloc];
}
@end
上面的代码中我们创建了两个类,Person对象有一个Book属性。接着在controller中操作它们。
Person *p = [[Person alloc]init];
Book *book = [[Book alloc]init];
[p setBook:book];
[book release];
book = nil;
[p release];
p = nil;
从controller中的代码一步一步的分析,首先初始化了Person和Book对象,此时他们的引用计数都是1。接着就是把book对象通过setter方法赋给p,此时p也持有了这个Book对象,根据内存管理的原则竟然持有了这个对象,这个对象的引用计数就要加1。所有有了
_book = [book retain];
接着继续book不再用这个对象就会release,此时Book的引用计数-1。接着p指针也不再用Perosn了,p会release。在Person销毁时,他还持用Book,所以他得负责人,在走之前先把Book也释放了,于是就有了在person的dealloc方法之前对_book进行-1
-(void)dealloc{
[_book release];
[super dealloc];
NSLog(@"---person释放了-");
}
网友评论