Objective-C學習筆記 UIView內存釋放問題
Objective-C學習筆記 UIView內存釋放問題是本文要介紹的內容,UIView內存釋放,之前一直以為把alloc的UIView對象,最后release掉或者removeFromSuperview掉就可以了。但是最近項目中出現了當釋放父試圖時,子視圖的內存不釋放,最后導致內存泄漏,報內存警告最后程序崩潰。
造成UIview內存泄漏的原因是,當釋放UIView時,其子視圖中有占有的資源沒有釋放掉,如動畫沒有結束,最后造成內存不會釋放掉。
下面的代碼能夠很好的展示上述過程:
在主視圖上添加一個AnimationView,然后在AnimationView中在添加一個視圖:
- Animations *animationView=[[Animations alloc] initWithFrame:CGRectMake(10, 10, 270, 400)];
- [animationView setBackgroundColor:[UIColor yellowColor]];
- [self addSubview:animationView];
- [animationView release];
在Animations視圖中添加一個遞歸的動畫:
- - (void)wobble {
- NSLog(@">>>>>>>>>>>>>>>>>>");
- CGFloat rotation = (kWobbleRadians * M_PI * 2) / 360.0;
- CGAffineTransform wobbleLeft = CGAffineTransformMakeRotation(rotation);
- [UIView beginAnimations:nil context:nil];
- [UIView setAnimationDuration:kWobbleTime];
- [UIView setAnimationDelegate:self];
- self.transform = wobbleLeft;
- // if (!releaseFlage) {
- [UIView setAnimationDidStopSelector:@selector(wobble)];
- // }
- [UIView setAnimationRepeatAutoreverses:NO];
- [UIView commitAnimations];
- }
由于當前類每隔3秒鐘要執行一次遞歸,所以當在主視圖中移除AnimationView時,由于AnimationView的子視圖動畫是一個遞歸沒有結束,所以當前這個視圖樹不會釋放,只是不再界面上顯示,最終造成內存泄漏。解決辦法如下,當AnimationView想要移除時,需要將其子視圖上的動畫移除掉。我的做法是在AnimationView中添加下面方法即可:
- - (void)willRemoveSubview:(UIView *)subview
- {
- Animations *downBookView=(Animations *)subview;
- downBookView.releaseFlage=TRUE;
- }
這樣內存其視圖樹就會跟著釋放掉內存,從系統中徹底釋放掉了。
小結:Objective-C學習筆記 UIView內存釋放問題的內容介紹完了,希望本文對你有所幫助。