@autoreleasepool {}在ARC下還能用

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的內存釋放方法還須要研究。。。。。。。

相關文章
相關標籤/搜索