博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
autorelease
阅读量:7120 次
发布时间:2019-06-28

本文共 1213 字,大约阅读时间需要 4 分钟。

hot3.png

autorelease是自动释放,看上去像ARC,其实更类似与C语言的自动变量(没有任何修饰符的局部变量)的特性。

C语言的自动变量特性:程序执行时,若自动变量超出其作用域,该自动变量将被自动废弃。

{  int a;}//因为超出变量作用域 自自动变量 int a 被废弃,不能再访问

autorelease 会像 C 的自动变量那样来对待对象实例,当超出其作用域(相当于变量作用域)时,对象的release 实例方法 会被调用。

 

autorelease具体使用方法:

1.生成并持有NSAutoreleasePool 对象

2.调用已分配对象的autorelease 实例方法

3.废弃NSAutoreleasePool 对象

 

NSAutoreleasePool 对象的生存周期 相当于 C语言的自动变量作用域,对于所有调用过autorelease实例方法的对象,在废弃NSAutoreleasePool 对象时,都将调用release实例方法。

110848_cbZ2_2472425.png

 

用源代码表示如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];id obj = [[NSObject alloc] init];//将obj对象加入pool中[obj autorelease]; //等同于[pool release][pool drain];

在cocoa 框架中,相当于程序主循环的NSRunLoop在程序可运行的地方,对NSAutoreleasePool对象进行生成、持有、废弃处理。

113002_1jDK_2472425.png

使用autorelease 会带来的问题:如果大量产生autorelease的对象时,又不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时会产生内存不足的现象。

解决办法:有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。

 

autorelease实例方法的本质:调用 NSAutoreleasePool 的 addObject 类方法。

也就是说调用autorelease 方法 会将调用的对象放入 自动释放池 中 

- (id)autorelease{  [NSAutoreleasePool addObject:self];}

 

 

ARC

@autoreleasepool{  id __autoreleasing obj = [[NSObject alloc] init]; }

在ARC有效时,用 块 替代 NSAutoreleasePool类, 

                     用附有 __autoreleasing 修饰符的变量  替代  autorelease 方法。

 

注意:加不加 __autoreleasing  修饰符  都可以。 为什么呢??

待续。。。

转载于:https://my.oschina.net/u/2472425/blog/967447

你可能感兴趣的文章
android adb shell 常用命令
查看>>
判断文件大小的函数
查看>>
最近找到了一个免费的python教程,两周学会了python开发【内附学习视频】
查看>>
JHipster生成微服务架构的应用栈(三)- 业务微服务示例
查看>>
php用curl获取远端网页内容
查看>>
selenium+python谷歌驱动配置
查看>>
oralce的function处理考勤时间节点以及计算工作时间
查看>>
(三)、一步一步学GTK+之布局
查看>>
43. ExtJs控件属性配置详细
查看>>
ros名称、命名空间和重映射
查看>>
系统进程查看 --- 微软官方出品
查看>>
Python 第三方模块安装出现的问题和解决方案.
查看>>
实验1
查看>>
CF915E Physical Education Lessons(珂朵莉树)
查看>>
洛谷P5050 【模板】多项式多点求值
查看>>
第十章:基本数据结构(2)
查看>>
php处理管道文件流
查看>>
Centos 6 搭建安装 Gitlab
查看>>
2012.02.13(rtsp)
查看>>
关于设置安卓屏幕的显示方向
查看>>