在之前的文章中也有写一些页面跳转,和页面对应的释放问题,但是对于新手来讲,有时候总是会忘记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 ;
}
}];
}