您的位置:首页 > 职场人生

【黑马程序员】autorelease用法

2015-08-23 13:10 260 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

autorelease自动释放池

autorelease 的用法

autorelease 快速创建对象的方法

autorelease(自动释放池)

1.autorelease介绍
1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的。

2) 当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中

2.autorelease的创建方式

1)iOS 5.0以前的创建方式

2)iOS 5.0 以后

//iOS 5.0以前的创建方式
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
//中间是在autoreleasepool中的代码
[pool release];//[pool drain];用于mac


//5.0之后
@autoreleasepool{
//在这里创建的对象,都会自动调用autorelease
}   //在autorelease 结束时,会自动向代码块中的每一个对象发送release消息


autorelease 的用法

1.创建的对象,要在autoreleasepool中调用autorelease方法

#import <Foundation/Foundation.h>
#import "Person.h" //假设已有一个Person类
int main(int argc, const char * argv[]){
@autoreleasepool{
Person p = [Person new];
[p autorelease];//这样p就被加入了当前的autoreleasepool中
//不过一般不这样用了,因为在创建一个对象时,会自动调用autoreleae方法。

}
return 0;
}


2.自动释放池的嵌套使用

Person *p = [Person new];
[p retain];
@autoreleasepool{
@autoreleasepoo{
[p autorelease];  //先执行最内部的autorelesepool,在该autorelease结束时,给p发送release消息,p的retainCount变为1
}

[p autorelease]; //再将p加入到外部autoreleasepool中,该池结束时,给p发送release消息,p的retainCount变为0,对象p被销毁
}


3.自动释放池不宜放占用内存比较大的对象

1)尽量避免对大内存使用该方法,对于这种延迟释放机制,会造成短时间内内存的上涨。

2)不要把大量循环操作放到同一个@autorelease之间,这样会造成内存峰值的上升

autorelease 快速创建对象的方法

Person.h文件

#import <Foundation/Foundation.h>

@interface Person : NSObject
+(instancetype)person;
@end


Person.m文件

#import "Person.h"
@implementation Person
+(instancetype)person{
return [[[Person alloc] init] autorelease]; //返回的是对象的空间,这样就可以帮我们自动的把对象加入到自动释放池
}
@end


版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: