@IT·互联网程序员手机移动程序开发

内存管理-多对象内存管理解析

2017-04-16  本文已影响36人  Mr_HeH

从前面的例子我们可以看出单个对象的内存管理无非就是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释放了-");
}
上一篇下一篇

猜你喜欢

热点阅读