内存管理 问题集锦一
来源:互联网 发布:淘宝登陆界面打不开 编辑:程序博客网 时间:2024/06/07 02:45
1、以下代码有什么问题吗?如果没有的话,obj、obj2的引用计数分别是多少?如果有问题的话存在什么问题?
Class *obj = [[Class alloc] init]; //引用计数 为 1Class *obj2 = obj; //这里只是赋值[obj hello]; [obj release]; // 引用计数 减为 0[obj2 hello]; //也许,程序运行到这行代码不会立即崩溃,因为释放内存是需要一定时间的。[obj2 release]; //这行肯定崩溃,因为已经没有内存拿给obj2释放了,再释放,属于过度释放了。
2、在实际开发的过程中,什么情况下需要创建自动释放池?下面代码中有没有什么问题?
MRC模式,自己创建后或者拥有一个对象后,需要自己负责释放。MRC下的内存管理机制有三条原则:
第一条:使用 alloc / new / copy 都使其引用计数加1 第二条:通过其他方法(便利构造器)获得对象,要明白其内部引用计数加1,并且内部已经使用autorelease帮我们释放内存。所以也就是我们尽管用即可。第三条:要保证retain 和 release 的出现次数相等。也就是保证内存没有浪费。
正是由于在MRC下,管理内存很麻烦,对一个对象的销毁时机也不是很清楚的时候,引入ARC来管理iOS的内存,相对于程序员的我们来说,使用起来十分方便。ARC :自动引用计数。就需要借助于自动释放池,自动释放池其实主要是针对与 autorelease 来说的。因为不知道什么时候应该释放这个对象,所以我们借助于自动释放池。一旦走出来自动释放池,对象就立马销毁。但是自动释放池也有很多缺陷。比如说,自动释放池,含有特别多的对象的auturelease ,由于autorelease 不能立即释放内存,所以在没有出自动释放池之前,内存一直都没有得到释放,对象一多,就会造成内存紧张。
所以,什么情况下需要创建自动释放池,鄙人觉得,就是在我们拿不定时机来释放某一个对象的时候,就需要创建自动释放池,便于内存管理。
Person *personOne = [[Person alloc] init]; // 引用计数 为 1@autoreleasepool{ [personOne autorelease]; //目前暂时 为 1,出了自动释放池后减为0 @autoreleasepool{ [personOne autorelease]; //目前 为 1} //出了这个自动释放池,personOne 的引用计数减为 0 ,之后内存被释放} //此时,出这个自动释放池的话,已经没有内存共personOne来释放的了,属于过度释放。
0 0
- 内存管理 问题集锦一
- 内存管理 问题集锦二
- 内存管理 问题集锦二
- 操作系统内存管理问题集锦
- 学生管理系统问题集锦一
- 学生信息学管理系统问题大集锦(一)
- [置顶] 问题集锦一
- protobuf问题集锦(一)
- spark集群管理问题集锦
- CSS样式问题集锦(一)
- C问题集锦(一)
- W5500问题集锦(一)
- Android 小问题 集锦一
- 内存管理(一)
- Linux内存管理(一)
- 内存管理(一)
- 内存管理一
- 内存的管理(一)
- U-boot移植之RK-PX2开机启动打印信息
- android开发设计模式の单例模式
- 欢迎使用CSDN-markdown编辑器
- 发布iOS企业分发(一)(iOS开发账号说明)
- acm杭州电子科技大学新生赛
- 内存管理 问题集锦一
- 深度学习(十六)基于2-channel network的图片相似度判别
- IntelliJ IDEA 的 20 个代码自动完成的特性
- Samba访问权限限制问题--Fedora14
- HDU 4864 Task(贪心)
- 使C# 窗体的关闭按钮、最小化、最大化按钮不可用
- HPU 问题 G: 感恩节KK专场——与学妹滑雪 【最短路 double 精度判断】
- windows下安装redis
- 数据结构——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现