天天看点

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 多个对象之间的内存管理

继续阅读