第六讲:Obj-C 内存管理4 - 自动释放池
来源:互联网 发布:今年欧文总决赛数据 编辑:程序博客网 时间:2024/05/27 09:45
转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/
第六讲:Obj-C 内存管理4 - 自动释放池
什么是自动释放池
自动释放池的好处
如何创建一个自动释放池
自动释放池如何释放对象内存
自动释放池栈式结构管理
Autorelease pool
1. 自动释放池(Autorelease Pool)是 OC 的一种内存自动回收机制,可以将一些临时变量通过自动释放吃来回收统一释放
2. 当自动释放池本身销毁的时候,池子里所有的对象都会做一次 release 操作
autorelease
任何OC对象只要调用 autorelease 方法,就会把该对象放大离自己最近的自动释放池中(栈顶的释放池)
创建自动释放池 (两种方法)
@ autoreleasepool
{
}
IOS5.0 之前的老方式
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];
遛狗原理
典型例子(正确)
Dog *dog1 = [[Dog alloc] init];
[xiaoLi setDog:dog1];
[dog1 release];
典型例子 (错误)
[xiaoLi setDog:[[Dog alloc] init]];
上述代码有内存泄漏
典型例子(正确)好的方法
Dog *dog = [[[Dog alloc] init] autorelease];
[xiaoLi setDog:dog1];
//这里不能跟 [dog1 release];
典型例子(正确) 放成一行
[xiaoLi setDog:[[[Dog alloc] init] autorelease]];
黄金法则
如果对一个对象使用了 alloc, [mutable]copy, retain,那么必须使用相应的 release 或者 autorelease
举例
// Dog.h#import <Foundation/Foundation.h>@interface Dog : NSObject{ int _ID;}@property int ID;@end
// Dog.m#import "Dog.h"@implementation Dog@synthesize ID = _ID;- (void) dealloc{ NSLog(@"dog %d dealloc", _ID); [super dealloc];}@end
// Person.h#import <Foundation/Foundation.h>#import "Dog.h"@interface Person : NSObject{ Dog *_dog;}@property (retain) Dog *dog;@end
// Person.m#import "Person.h"@implementation Person@synthesize dog = _dog;- (void) dealloc{ self.dog = nil; NSLog(@"person dealloc"); [super dealloc];}@end
// main.m#import <Foundation/Foundation.h>#import "Person.h"#import "Dog.h"int main (int argc, const char * argv[]){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, World!"); Person *xiaoLi = [[Person alloc] init]; Dog *dog1 = [[[Dog alloc] init] autorelease]; // 把 dog1 这条狗放在自动释放池里,上边的pool中 NSLog(@"dog1 retaincount is %ld", [dog1 retainCount]); xiaoLi.dog = dog1; NSLog(@"dog1 retaincount2 is %ld", [dog1 retainCount]);// [dog1 release]; // autorelease 了,不需要再 release [xiaoLi release]; NSLog(@"dog1 retaincount3 is %ld", [dog1 retainCount]); [pool release]; NSLog(@"end of release"); return 0;}/* 输出结果 Hello, World! dog1 retaincount is 1 dog1 retaincount2 is 2 person dealloc dog1 retaincount3 is 1 dog 0 dealloc end of release*/
- 第六讲:Obj-C 内存管理4 - 自动释放池
- 第三讲:Obj-C 内存管理1 - 黄金法则
- 第四讲:Obj-C 内存管理2 - retain / copy
- 第五讲:Obj-C 内存管理3 - 自定义MyArray
- Objective-C内存管理第五弹:自动释放池
- object-c 内存管理(二) 自动释放池
- Obj-c内存管理
- 内存管理之自动释放池
- MRC内存管理2自动释放池
- oc内存管理 ---自动释放池
- IOS第六天——Obj-C的内存管理初步认识
- IOS第六天——Obj-C的内存管理初步认识
- OC-028.ARC自动内存管理的自动释放池
- objective-C 的内存管理之-自动释放池(autorelease pool)
- Object-C内存管理---资源自动释放池(The Autorelease Pool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-自动释放池(autorelease pool)
- SPRING.NET 1.3.2 学习11--设置空值和Null值
- PL/SQL Developer 与tnsnames.ora
- 向量的点乘和叉乘
- Android网址链接加下划线
- Linux的帧缓冲设备
- 第六讲:Obj-C 内存管理4 - 自动释放池
- 史玉柱:一个创业过来人的脚印
- 【vim】vim和shell命令的交互
- datagridview设置默认单元格格式用以显示特定时间格式
- eclipse debug (调试) 学习心得
- SQL 基础笔记
- oracle 监控
- 成长记录--策略模式
- 2012的项目总结