@autoreleasepool什么意思啊在ARC和MRC下的区别

1.ARC下用 @autoreleasepool什么意思啊 {}主要还是为了避免内存峰值简单点的说在{}中存放的对象会在稍后的某个时刻释放掉

(3)不管这个对象是在自动释放池内还是外创建的,只要在自动释放池内写一个[p1 autorelease];p1就会被放到自动释放池中注意autorelease是一个方法,且只有在自动释放池中使用才有效

(4)如果把一个对象重复加到自动释放池如[p1 autorelease];[p1 autorelease];,那么会出错原因是:加载几次,届时自动释放池就会用[p1 release];释放几次但是由于这两个加载的对象其实是一个对象同样地址,所以第一次洎动释放正确第二次自动释放时发现已经被释放了,所以p1就变成了野指针

(5)以下是自动释放池嵌套的使用规则和注意点。

(6)@autoreleasepool什么意思啊的应用:如果需要在方法中创建对象并把这个对象作为返回值,那么可以在这个方法中使用[*** autorelease];把它加入到自动释放池中否则,直接用[*** release];来匹配alloc的话在该方法中就已经把这个对象alloc和release了一遍相当于释放了,那么所谓的返回对象返回的时一个野指针(没有指向任何对象)当然,调用这个方法的代码页需要写在自动释放池作用域内才生效

(7)接上面。返回对象的那个方法中创建对象不建议直接用类名,而是用self否则如果存在子类调用会崩溃。如Car *car1=[[self alloc]init];

(9)在ARC机制中我们用@property声明的成员变量,建议用strong代替之前手动管理内存时的retain虽然后者仍然鈳以使用。因为我们在ARC中内存管理就是看是否有强指针指向对象如有就不回收,如没有就回收所以强指针是strong,相反是weak而基本数据类型我们还是习惯用assign。

(10)虽然Xcode提供了非ARC转换成ARC的很少有把整个非ARC转换成ARC的。如果我们导入第三方库时需要非ARC和ARC共存,即我们系统默认昰ARC我们需要让系统不要去管这个非ARC的第三方库,如下设置:双击响应的.m文件输入-fno-objc-arc回车即可。

(11)顺便当出现两个类循环引用的话(吔就是A要包含B,B要包含A即A对象要作为B的变量,B对象要作为A的变量)只需要把一方的strong改成weak,并且在响应的.h文件中把#import ".h"改成Class ***如果因为改成Class ***洏无法使用那个类的方法的话,只需要在它的.m文件中#import“.h”文件即可这个因为不是在.h文件中导入所以不冲突。

注意:利用webview加载gif图时左右來回滑动导致内存暴涨,用了

 之后内存有些变小,但是减下来的内存只有1~2MB没有比增长的多,更没有完全释放掉

webview的内存释放方法还需偠研究。。。

}

最近在学习 Objective-C 的 MRC 内存管理方式由於之前一直用 ARC,很多规则都不是很清楚需要反编译看编译器 emit 的指令来分析对象的 retain、release 时机。

Apple 官方文档中规定了几个基本准则概括来说就昰:

自己产生的垃圾自己收拾,别人的东西别馋和

别人的东西又属于那些呢?基本上就是 getter 方法获取到的对象或者通过非 alloc、init 类的类方法創建的对象,比如 arrayWithObject: 方法这类方法返回的对象不能被使用者 release,因为它们已经被 autorelease 过了或者 receiver 持有它们作为实例属性或 ivars。

但是如果使用者需要長期保留”别人的东西“那就需要自己 retain 了,当然使用完毕后还要 release。

根据上面的规则MRC 中一个十分重要的约定就是,getter 方法或者非 alloc、init 类构慥方法返回的对象处于 receiver那 ARC 与 MRC 混用时就会出现一个问题,我们假设下面的场景:

然后在一个 MRC 项目中使用这个 Foo 类由于开发者知道 fooWithIdentifier: 这类方法返回的对象会被 autorelease,所以他在使用完这个对象后并没有再次调用 release

问题发生了,上面的 Foo 实例 leaks 了

由于 ARC 的内存管理语义是编译器自动插入的,那么 fooWithIdentifier: 在编译时理应没有插入 autorelease因为编译器知道,调用者在对象使用完毕时已经插入了 release 指令

然而我们实际开发中,这样 ARC、MRC 框架混用是没有任何问题的为什么?

我们反编译一下上述方法:

这方法只创建了 Foo 对象没有做其他操作,然后返回被创建的对象可以看到最后被插入叻 objc_autoreleaseReturnValue 这个函数调用,它是干什么的呢这个函数的实现可以在 Objective-C Runtime 的源码中找到:

首先解释一下 __builtin_return_address 这个函数,它是一个编译器内置函数用于获取函数返回时地址,它的参数是函数调用的层级0 代表第一层,也就是当前函数

// 以下只截取 arm 架构的实现

如果看不懂汇编指令,上面的注释吔能解释得很清楚这个函数检查上面函数返回地址下的指令,如果发现 mov r7, r7(which 作为 ARC 的标志)就返回 true

然后我们就可以梳理一下这两种情况的處理方法了。

1. 对于调用方是 ARC 的情况:

调用方紧接着会把返回的对象当做参数来调用 objc_retainAutoreleasedReturnValue 这个函数它会检查 TLS 中的值,如果跟返回值相同那么鈈做任何操作;如果不同,则做 retain 操作

2. 对于调用方是 MRC 的情况:

将对象做 autorelease 操作,然后返回调用者拿到后根据约定,不再做任何内存管理的操作对象在 Run Loop 睡眠前被释放。


}

我要回帖

更多关于 pool什么意思啊 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信