1. 程式人生 > >IOS系列——頁面釋放不掉的問題

IOS系列——頁面釋放不掉的問題

在之前的文章中也有寫一些頁面跳轉,和頁面對應的釋放問題,但是對於新手來講,有時候總是會忘記release;很多時候頁面的確是跳轉過去了,但是關閉頁面的時候,記憶體釋放不掉,在這裡我也根據我在之前的一段時間的學習和應用中,總結了我遇到過的幾種可能性

1、手動釋放記憶體的:

一定要注意,有些物件沒有釋放的話,頁面一樣可以釋放掉,比如NSString 、NSMutableArray 等等這樣的物件,,只不過會造成記憶體洩露。

但是對於一些檢視類的物件,如果不釋放,即使關閉頁面,記憶體也釋放不掉,比如UIView *view  UIImageView *view  UIScrollview *view 等等,這裡面的view都要釋放掉才能保證記憶體及時準確的釋放

            secondview *sec = [[secondview alloc]initWithNibName:@"secondview" bundle:nil];
            [self presentViewController:sec animated:NO completion:^{}];
            [sec release];
而且在跳轉頁面的時候,上面程式碼裡面的這個也要保證釋放過

2、使用ARC自動回收機制的

使用自動回收機制的,我們不用吧注意力幾種到release上,但是同樣的,他的回收也是我們不可控制的,這就導致有些時候,物件release不了導致頁面釋放不了,比如說,頁面跳轉的時候,我們定義一個全域性變數  (secondview 是額外的一個類頁面)

@interface ViewController (){
    secondview *sec;
}
然後我們在跳轉事件的時候這樣寫
            sec = [[secondview alloc]initWithNibName:@"secondview" bundle:nil];
            [self presentViewController:sec animated:NO completion:^{}];
這樣頁面跳轉過去之後,即使關閉頁面,這個頁面記憶體也釋放不掉,這個也提醒我們,我們在使用全域性變數的時候,要多留意了

3、頁面中有迴圈回撥函式的:

如果頁面中有迴圈回撥函式,頁面關閉的時候也關不掉,比如我之前寫了一個頁面,上面是有一張圖片的不停旋轉

-(void)startAnimation:(UIImageView *)view{
    CGAffineTransform endAngle = CGAffineTransformMakeRotation(angle * (M_PI / 180.0f));
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        view.transform = endAngle;
    } completion:^(BOOL finished) {
        angle += 1;
        [self startAnimation:view];
    }];
}
如果在方法中直接這樣寫得話,記憶體是釋放不掉的, 為了避免這種狀況,我們需要加判斷,在關閉頁面的時候讓他不能繼續回撥;設定一個BOOL變數 haveClosed;並初始化為YES;在關閉頁面的時候,將haveClosed設定為NO;旋轉的函式改寫為:
-(void)startAnimation:(UIImageView *)view{
    CGAffineTransform endAngle = CGAffineTransformMakeRotation(angle * (M_PI / 180.0f));
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        view.transform = endAngle;
    } completion:^(BOOL finished) {
       if(haveClosed == YES){
        angle += 1;
        [self startAnimation:view];
    }else{
        return ;
       } 
    }];
}