内存管理 问题集锦一

来源:互联网 发布:淘宝登陆界面打不开 编辑:程序博客网 时间: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
原创粉丝点击