定时器造成的内存泄露问题

下边是一个定时器的创建方法:

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

target:The object to which to send the message specified by aSelector when the timer fires. The timer maintains a strong reference to this object until it (the timer) is invalidated.

target:定时器会强引用target直到定时器终止。

因此现在很明确了,如果把定时器申明成了target的属性,那将必然引起循环引用。这个有分为两种情况:

情况一:target是ViewController

这时候我们要想不造成循环引用,解决方案是在viewWillDisappear的关闭定时器。

情况二:target为我们封装的空间

如果target是我们自己封装的控件,那怎么办呢?如果我们依然在viewWillDisappear里边停掉定时器的话岂不是破坏了这个控件的封装性。如果这个控件交给别人使用的话,还得让别人注意要在viewWillDisappear中停掉定时器。

苹果提供了一个方法:

- (void)willMoveToSuperview:(nullable UIView *)newSuperview;

Tells the view that its superview is about to change to the specified superview.

The default implementation of this method does nothing. Subclasses can override it to perform additional actions whenever the superview changes.

告诉子视图它现在的父视图准备把它移动到特定的视图上。默认这个方法的实现是什么也不做。子视图可以重写来执行额外的方法无论父视图什么时候改变。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,928评论 25 708
  • 阳光明媚的三伏天里,汗水轻抚着脸颊,站在天桥上凝望十字路口,不知那方风景美,更不知是否有人在观望我。只会像疯子一样...
    海风无韵阅读 293评论 0 0
  • *最幸福的就是我啦!!在该上学时努力上学,快毕业时就马上找到了一个疼我爱我宠我的男朋友,把我宠的不要不要的!我们两...
    雨过天晴感悟阅读 199评论 0 0
  • 时光知味,岁月沉香。这些年来有没有人能记住我起初的模样? 岁月,静静的;时光,缓缓的……遥想童年,依稀记得那是五彩...
    弓米弓米弓阅读 322评论 0 0