UIView的生命周期是通常会被忽略的一个问题,因为我们有UIViewController自动管理UIView的生命周期。但是了解UIView的生命周期是很有用的。
今天在开发一个需求的时候,不得不在UIView的一个子类中调用performSelector:这个方法去执行延时操作
[self performSelector:@selector(p_countingAction) withObject:nil afterDelay:self.countingDelay inModes:[NSArray arrayWithObjects:UITrackingRunLoopMode, NSDefaultRunLoopMode,nil]];
大家都知道performSelector:会引用调用它的对象,如果在延时正在执行的时候退出这个View所在的UIViewController这个View是不会释放的,造成内存泄漏。解决方法是在View释放之前调用cancelPreviousPerformRequestsWithTarget:方法释放view。
[NSObject cancelPreviousPerformRequestsWithTarget:self];
如果这里是一个UIViewController 调用就好说了,因为UIViewController有viewWillDisappear和viewDidDisappear方法。直接在这个方法里调用就ok了。但是这是在view里调用的,所以就要用到willMoveToSuperView:。
- (void) willMoveToSuperView:(UIView *)newSuperView{
if (! newSuperView) {
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}
[super willMoveToSuperview:newSuperview];
}
结论:
willMoveToSuperView:这个方法是在视图即将加入或者移除某个window时调用。如果 newWindow为空就表示移除,也就是view即将被销毁。类似于UIViewController的viewWillDisappear方法。
最好还是利用ViewController去管理view的生命周期。本文讲诉的方法是在不得已的情况下适用。