Objective-C學(xué)習(xí)筆記 UIView內(nèi)存釋放問題
Objective-C學(xué)習(xí)筆記 UIView內(nèi)存釋放問題是本文要介紹的內(nèi)容,UIView內(nèi)存釋放,之前一直以為把a(bǔ)lloc的UIView對象,最后release掉或者removeFromSuperview掉就可以了。但是最近項(xiàng)目中出現(xiàn)了當(dāng)釋放父試圖時(shí),子視圖的內(nèi)存不釋放,最后導(dǎo)致內(nèi)存泄漏,報(bào)內(nèi)存警告最后程序崩潰。
造成UIview內(nèi)存泄漏的原因是,當(dāng)釋放UIView時(shí),其子視圖中有占有的資源沒有釋放掉,如動(dòng)畫沒有結(jié)束,最后造成內(nèi)存不會釋放掉。
下面的代碼能夠很好的展示上述過程:
在主視圖上添加一個(gè)AnimationView,然后在AnimationView中在添加一個(gè)視圖:
- Animations *animationView=[[Animations alloc] initWithFrame:CGRectMake(10, 10, 270, 400)];
- [animationView setBackgroundColor:[UIColor yellowColor]];
- [self addSubview:animationView];
- [animationView release];
在Animations視圖中添加一個(gè)遞歸的動(dòng)畫:
- - (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];
- }
由于當(dāng)前類每隔3秒鐘要執(zhí)行一次遞歸,所以當(dāng)在主視圖中移除AnimationView時(shí),由于AnimationView的子視圖動(dòng)畫是一個(gè)遞歸沒有結(jié)束,所以當(dāng)前這個(gè)視圖樹不會釋放,只是不再界面上顯示,最終造成內(nèi)存泄漏。解決辦法如下,當(dāng)AnimationView想要移除時(shí),需要將其子視圖上的動(dòng)畫移除掉。我的做法是在AnimationView中添加下面方法即可:
- - (void)willRemoveSubview:(UIView *)subview
- {
- Animations *downBookView=(Animations *)subview;
- downBookView.releaseFlage=TRUE;
- }
這樣內(nèi)存其視圖樹就會跟著釋放掉內(nèi)存,從系統(tǒng)中徹底釋放掉了。
小結(jié):Objective-C學(xué)習(xí)筆記 UIView內(nèi)存釋放問題的內(nèi)容介紹完了,希望本文對你有所幫助。