内存管理原则
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;
}
程序输出结果