IOS系列——頁面釋放不掉的問題
阿新 • • 發佈:2019-02-07
在之前的文章中也有寫一些頁面跳轉,和頁面對應的釋放問題,但是對於新手來講,有時候總是會忘記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 ;
}
}];
}