UIView的生命周期:善用willMoveToSuperView方法。

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的生命周期。本文讲诉的方法是在不得已的情况下适用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 启动流程 1.1 准备知识 Mach-O Apple的操作系统的可执行文件格式几乎都是mach-o,mach...
    我有小尾巴快看阅读 3,245评论 1 37
  • 27、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是...
    烟雨平生花飞舞阅读 628评论 0 1
  • UIView的生命周期总结 来源: bestswifter(@bestswifter) 链接:https://be...
    简简蜗牛阅读 1,729评论 1 3
  • 日复一日的生活心态波澜不惊,可当身边的人和事真的开始变化乃至翻天覆地,才在午夜的床头某日歇斯底里到人生真的如一部大...
    lemon_yf阅读 214评论 0 0
  • 午夜 灯光脆 轻轻一碰 倦意落满地 这就睡 睡前照例听曲 曲尽 朦胧中 夜睁开眼睛
    夏虫单阅读 175评论 0 2