欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Objective-C学习笔记 UIView内存释放问题

来源: 开发者 投稿于  被查看 30623 次 评论:214

Objective-C学习笔记 UIView内存释放问题


Objective-C学习笔记 UIView内存释放问题是本文要介绍的内容,UIView内存释放,之前一直以为把alloc的UIView对象,最后release掉或者removeFromSuperview掉就可以了。但是最近项目中出现了当释放父试图时,子视图内存不释放,最后导致内存泄漏,报内存警告最后程序崩溃。

造成UIview内存泄漏的原因是,当释放UIView时,其子视图中有占有的资源没有释放掉,如动画没有结束,最后造成内存不会释放掉。

下面的代码能够很好的展示上述过程:

在主视图上添加一个AnimationView,然后在AnimationView中在添加一个视图:

  1. Animations *animationView=[[Animations alloc] initWithFrame:CGRectMake(10, 10, 270, 400)];   
  2.         [animationView setBackgroundColor:[UIColor yellowColor]];   
  3.         [self addSubview:animationView];   
  4.         [animationView release]; 

在Animations视图中添加一个递归的动画:

  1. - (void)wobble {   
  2.     NSLog(@">>>>>>>>>>>>>>>>>>");   
  3.         CGFloat rotation = (kWobbleRadians * M_PI * 2) / 360.0;   
  4.         CGAffineTransform wobbleLeft = CGAffineTransformMakeRotation(rotation);   
  5.         [UIView beginAnimations:nil context:nil];   
  6.         [UIView setAnimationDuration:kWobbleTime];   
  7.         [UIView setAnimationDelegate:self];   
  8.         self.transform = wobbleLeft;   
  9.    //     if (!releaseFlage) {   
  10.             [UIView setAnimationDidStopSelector:@selector(wobble)];   
  11.    //     }   
  12.         [UIView setAnimationRepeatAutoreverses:NO];   
  13.         [UIView commitAnimations];   

由于当前类每隔3秒钟要执行一次递归,所以当在主视图中移除AnimationView时,由于AnimationView的子视图动画是一个递归没有结束,所以当前这个视图树不会释放,只是不再界面上显示,最终造成内存泄漏。解决办法如下,当AnimationView想要移除时,需要将其子视图上的动画移除掉。我的做法是在AnimationView中添加下面方法即可:

  1. - (void)willRemoveSubview:(UIView *)subview   
  2. {   
  3.     Animations *downBookView=(Animations *)subview;   
  4.     downBookView.releaseFlage=TRUE;   

这样内存视图树就会跟着释放掉内存,从系统中彻底释放掉了。

小结:Objective-C学习笔记 UIView内存释放问题的内容介绍完了,希望本文对你有所帮助。

用户评论