1.ARC下用 @autoreleasepool {}主要仍是为了不内存峰值。简单点的说在{}中存放的对象会在稍后的某个时刻释放掉java
(1)在自动释放池@autoreleasepool{}中alloc一个对象后(如p1),仍然须要用[p1 autorelease];只是这个语句和[p1 release];不一样,后者表示把p1的retainCount-1,而前者仅仅表示把p1放到自动释放池中返回一个self,自动释放池结束销毁时,统一对里面的对象引用计数retainCount-1。web
(2)@autoreleasepool{}能够随意建立,也能够嵌套使用。spa
(3)无论这个对象是在自动释放池内仍是外建立的,只要在自动释放池内写一个[p1 autorelease];p1就会被放到自动释放池中。注意autorelease是一个方法,且只有在自动释放池中使用才有效。指针
(4)若是把一个对象重复加到自动释放池如[p1 autorelease];[p1 autorelease];,那么会出错。缘由是:加载几回,届时自动释放池就会用[p1 release];释放几回,可是因为这两个加载的对象实际上是一个对象一样地址,因此第一次自动释放正确,第二次自动释放时发现已经被释放了,因此p1就变成了野指针。code
(5)如下是自动释放池嵌套的使用规则和注意点。orm
#import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { Person *p1=[[Person alloc]init]; @autoreleasepool { @autoreleasepool { [p1 autorelease]; }//在执行到此处时,p1被自动释放 } //如下代码有错误 @autoreleasepool { [p1 autorelease];//此时p1被加入进来 @autoreleasepool { [p1 autorelease];//被重复加载进来,但仍然同一个 }//此处,p1被自动释放了,因此第一次加进来的那个也被释放了,由于是同一个对象 }//因此此处在调用[p1 release];时就出现报错:野指针 return 0; }
(6)@autoreleasepool的应用:若是须要在方法中建立对象,并把这个对象做为返回值,那么能够在这个方法中使用[*** autorelease];把它加入到自动释放池中,不然,直接用[*** release];来匹配alloc的话,在该方法中就已经把这个对象alloc和release了一遍至关于释放了,那么所谓的返回对象返回的时一个野指针(没有指向任何对象)。固然,调用这个方法的代码页须要写在自动释放池做用域内才生效。对象
(7)接上面。返回对象的那个方法中,建立对象不建议直接用类名,而是用self,不然若是存在子类调用会崩溃。如Car *car1=[[self alloc]init];blog
(8)其实诸如NSString *str1=[NSString stringWithFormat:@"%@",@"hello"];也是调用了一个方法,而且返回了一个字符串对象。比照(6)和(7)咱们得知这个stringWithFormat应该也是顺便返回了一个autorelease。内存
(9)在ARC机制中,咱们用@property声明的成员变量,建议用strong代替以前手动管理内存时的retain,虽而后者仍然可使用。由于咱们在ARC中内存管理就是看是否有强指针指向对象,若有就不回收,如没有就回收。因此强指针是strong,相反是weak。而基本数据类型咱们仍是习惯用assign。webview
(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图时,左右来回滑动致使内存暴涨,用了
@autoreleasepool {
for (UIView *subview in self.welcomeScr.subviews) {
if ([[subview class]isSubclassOfClass:[UIWebView class]]) {
[subview removeFromSuperview];
}
}
NSInteger index= self.welcomeScr.contentOffset.x/ScreenW;
NSInteger count = index+1;
NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%ld",index+1] ofType:@"gif"];
NSData *gifData = [NSData dataWithContentsOfFile:path];
UIWebView *webView = [self createWebViewWithFrame:CGRectMake(ScreenW * index ,0,ScreenW,ScreenH)];
[webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
[self.welcomeScr addSubview:webView];
}
以后,内存有些变小,可是减下来的内存只有1~2MB,没有比增加的多,更没有彻底释放掉
webview的内存释放方法还须要研究。。。。。。。