苹果如何实现 autorelease
来源:互联网 发布:口型识别的视频数据库 编辑:程序博客网 时间:2024/05/16 07:32
autorelease是苹果引以为傲的地方,它为程序开发人员减轻了很大的开发压力,下面就介绍下autorelease。
autorelease ,顾名思义,就是自动释放,它看上去就像是ARC,其实他更像C语言里面的自动变量(局部变量),
C语言里面的局部变量,就是当变量超出其作用域以后,该自动变量就会被自动抛弃。下面复习下C语言里面的自动变量
-(void)getIt
{
int a =0;
/*
*因为超出变量作用域,
*自动变量“int a”被废弃,不可再访问
*/
}
autorelease的具体使用方法是:1)、生成并持有NSAutoReseasePool对象。2)、调用已分配对象的autorelease实例方法。3)、废弃NSAutoReseasePool对象
-(void)objcAutorelease
{
NSAutoreleasePool * autoreleasePool = [[NSAutoreleasePoolalloc]init];
id objc = [[NSObjectalloc]init];
[objcautorelease];
[autoreleasePooldrain];
/*
*[autoreleasePool drain] 相当于 [objc release];
*自动释放池[autoreleasePool drain]的时候,会给池子里面的对象发送一个release消息,让实例变量执行release方法
*/
}
for (int i =0; i<10000; i++) {
/*
*读入大量图像10000
*由于没有废弃NSAutoreleasePool对象
*最终导致内存不足
*/
}
for (int i =0; i<10000; i++) {
NSAutoreleasePool * autoreleasePool = [[NSAutoreleasePoolalloc]init];
/*
*读入大量图像
*由于没有废弃NSAutoreleasePool对象
*最终导致内存不足
*/
[autoreleasePooldrain];
/*
*通过[autoreleasePool drain];
*autorelease对象被一起release
*/
}
NSArray * arr1 = [NSArrayarray];//里面已经存在autorelease
NSArray * arr2 = [[[NSArrayalloc]init]autorelease];
NSMutableArray * mutableArr1 = [NSMutableArrayarrayWithCapacity:2];
NSMutableArray *mutableArr2 = [[[NSMutableArrayalloc]initWithCapacity:2]autorelease];
其实autorelease的实现,我们可以追溯到源代码
id obj = [[NSObjectalloc]init];
[obj autorelease];
其实obj内部实现应该是如下方式-(void)autorelease
{
[NSAutoreleasePooladdObject:self];
}
autorelease的实质方法的本质就是调用了NSAutoreleasePool对象的addObject的类方法那到底苹果自己是如何处理NSAutoreleasePool的呢?它的内部实现应该是怎么样的呢,我们可以简单的如下猜想
NSAutoreleasePool调用的addObject方法如下:
+(void)addObject:(id)anObject
{
NSAutoreleasePool * autoreleasePool =//取得正在使用NSAutoreleasePool的对象;
if (autoreleasePool) {
[autoreleasePool addObject:anObject];
}else{
//对象非存在状态下调用autorelease
}
}
然后是NSAutoreleasePool的对象autoreleasePool调用addObject:方法,此时被autorelease的该对象,将会被添加到正在使用的NSAutoreleasePool里面。那NSAutoreleasePool的对象能不能autorelease呢?
答案是不能的,如果你调用
[autoreleasePoolautorelease];就会出现异常
控制台你会看到
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSAutoreleasePool autorelease]: Cannot autorelease an autorelease pool'
- 苹果如何实现 autorelease
- 如何理解autorelease
- 如何自使用autorelease
- 如何实现苹果自动化测试
- 苹果官方文档:使用Autorelease Pools
- 苹果是如何实现毛玻璃效果
- autorelease
- autorelease
- autorelease
- autorelease
- @autorelease
- autorelease
- Autorelease
- Autorelease
- autorelease
- autorelease
- autorelease
- Objective-C Autorelease Pool 的实现原理
- 使用sql更改表的列的数据类型和添加新列和约束
- 跨平台 字符集编码问题 C++ PHP互通字符集的问题
- Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
- java垃圾回收器GC对性能吞吐量的影响
- Js 获取当前日期时间
- 苹果如何实现 autorelease
- 可不好加共和国和价格和房管局
- 第11周项目2-求最大公约数(2)
- 【网络流】 HDOJ 4067 Random Maze
- socket之flume监控系统
- PDA开发数据由DB下载至PDA本地
- 规范的合格合格规范化的鬼地方
- shell 判断当前用户
- 搭建通过 ssh 访问的 Git 服务器