- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
1.能知道什么是autoreleasepool。
学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)
什么是
release
/retain
,什么是野指针
一、本章笔记
一、为什么要什么到自动释放池
比如写release的时候 ,我们在release下面调用了对象方法 可能会出现野指针访问
这样的情况下,我们需要时时刻刻关注对象 什么时候释放
这时候 就出现了自动释放池
二、创建自动释放池的两种方式
iOS5.0之后(推荐)
@autoreleasepool {
// 在这里面使用的对象 都会加到自动释放池里面,当过了自动释放池代码块之后
都会对里面的对象 进行一次release消息 (不是销毁对象,而是release消息)
}
iOS5.0之前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
// ... 中间就是将所有的对象加入到自动释放池
// 销毁一个自动释放池
[pool release];
三、对象加入自动释放池的两种写法(调用autorelease方法的时候 ,会返回本身)
写法1
Person *p = [[[Person alloc]init] autorelease]; // 推荐使用
写法2
Person *p = [[Person alloc]init];
p = [p autorelease];
二、code
main.m
#pragma mark 01-autorelease基本概念
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#import "Person.h"
#pragma mark - main函数
int main(int argc, const char * argv[])
{
// iOS5.0之后写法
/*
@autoreleasepool {
// Person *p = [[Person alloc]init];
// [p run];
// // 时时刻刻都要关注对象 什么时候 释放
// [p release];
// [p run]; // 给野指针发消息 会报错
Person *p = [[Person alloc]init];
// 不用关心对象 什么时候 释放, 只要能够访问p的地方 都可以使用p
p = [p autorelease]; // 只要调用了autorelease,那么就不用调用release了
// [p retain];
[p run];
[p run];
[p run];
}
*/
#pragma autorelease其他写法1
@autoreleasepool {
// Person *p = [[Person alloc]init];
// p = [p autorelease];
Person *p = [[[Person alloc]init] autorelease];
[p run];
}
#pragma autorelease其他写法2
// 创建一个自动释放池
// 自动释放池 只是 将release延迟了而已
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Person *p = [[[Person alloc]init] autorelease];
[p run];
// 销毁一个自动释放池
[pool release];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)run;
@end
>>>.m
#import "Person.h"
@implementation Person
- (void)run
{
NSLog(@"%s",__func__);
}
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end