首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在UIViewController中使NSTimer无效以避免保留周期的最佳时机

是在视图控制器的生命周期方法中,特别是在视图控制器被释放时,将NSTimer无效化。这可以通过在视图控制器的deinit方法中实现。

在Swift中,deinit方法是在对象被释放时自动调用的。在这个方法中,我们可以将NSTimer对象无效化,以确保它不会继续保留视图控制器。

下面是一个示例代码:

代码语言:swift
复制
class MyViewController: UIViewController {
    var timer: Timer?

    override func viewDidLoad() {
        super.viewDidLoad()

        // 创建并启动NSTimer
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)
    }

    @objc func timerFired() {
        // 定时器触发的操作
    }

    deinit {
        // 在视图控制器被释放时,将NSTimer无效化
        timer?.invalidate()
    }
}

在上述代码中,我们在viewDidLoad方法中创建并启动了NSTimer。然后,在deinit方法中,我们将NSTimer无效化,以确保在视图控制器被释放时,NSTimer不会继续保留视图控制器。

这种做法可以避免保留周期的问题,确保在不再需要时正确释放NSTimer对象。这对于避免内存泄漏和提高应用程序性能非常重要。

腾讯云相关产品和产品介绍链接地址:

请注意,以上只是腾讯云的一些相关产品,其他云计算品牌商也提供类似的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Runtime运用:埋点统计

2、渲染时间 UIViewController生命周期中,Viewdidload和Viewdidappear之间时间可以认为是“UI渲染时间”,我们可以通过统计二者之间时间差距来统计页面的渲染时间...对应返回上一个界面的方式是pop和dismiss,一般pop或者dismiss方法调用之后,随后就会调用dealloc方法,将UIViewController内存情况,内存得到释放,如果无法调用dealloc...load方法中,将UIViewController生命周期几个method都通过method swizzling替换成我们自定义方法,自定义方法中进行埋点,从而达到统计和监测目的。...注意从下一个界面返回这个界面时也会调用viewdidappear,需要避免这个统计。...四、内存泄漏 因为UIViewController得不到释放而造成内存泄漏情景有三种 NSTimer NSTimer:一方面,NSTimer经常会被作为某个类成员变量,而NSTimer初始化时要指定

83020

浅析 NSTimer 和 CADisplayLink 内存泄漏

UITableViewCell 为例: 一、 Cell 中直接使用 NSTimer 首先我们按照常规做法,直接在 UITableView Cell 上添加相应 NSTimer, 并使用 scheduledTimer...所谓内存泄露就是本应该释放对象,在其生命周期结束之后依旧存在。...(image-d0e3cd-1528529178817)] 如图所示,开发中,如果创建定时器只是简单计时,不做其他引用,那么 timer 对象与 myClock 对象循环引用问题就可以避免(即省略...虽然孤岛问题已经避免了,但还是存在问题,因为 myClock 对象被 UIViewController 以及 timer 引用(timer 直接被 NSRunLoop 强引用着),当 UIViewController...所以我们要做向 myClock 对象发送 dealloc 消息前在给 timer 发送 invalidate 消息,从而避免本末倒置问题。

1.5K10

iOS 如何解决 NSTimer 循环引用

前言 ---- 使用 NSTimer,如果使用不得当特别会引起循环引用,造成内存泄露。所以怎么避免循环引用问题,下面我提出几种解决 NSTimer 几种循环引用。 2....原因 ---- 当你 ViewController (简称 VC )中使用 timer 属性,由于 VC 强引用 timer,timer target 又是 VC 造成循环引用。...,NSTimer 强引用 PFTimer,避免NSTimer 强引用 ViewController,这样就不会引起循环引用,然后 dealloc 方法中执行 NSTimer 销毁,相对 PFTimer...使用很简单,但是要注意两点: 避免 block 循环引用,使用 __weak 和 __strong 来避免 持用 NSTimer 对象方法中 -(void)dealloc 调用 NSTimer...传入参数时要通过 copy 方法,将 block 拷贝到"堆区",否则等到稍后要执行它时候,该 blcok 可能已经无效了。

1.4K30

关于 循环引用问题

Delegate 如果你知道Delegate为什么用weak修饰不用strong,也就明白了它为什么能造成循环引用,也能更好避免发生此问题。...NSTimer 因为NSTimer target 对传入参数都是强引用,所以当类具有NSTimer类型成员变量,并且需要反复执行计时任务时容易造成循环引用。...方法,放在viewDidDisappear中又限制太死,最好方法为(NSTimer类别): @interface NSTimer (EXBlock) + (NSTimer *)ex_scheduledTimeWithTimeInterval...原理:MLeaksFinder是从UIViewController入手UIViewControllerPOP或dismiss之后该控制器及其上view,viewsubviews都会被释放掉,MleaksFinder...内存泄漏提示 4.自定义检测工具 需求:检测UIViewController 是否发生内存泄漏。 思路:我们需要检测控制器对象POP后是否还存活,存活则表示有内存泄漏。

3.2K20

object-c编程tips-timer「建议收藏」

保留是类对象,因此也就不会有什么问题。 它传入要运行block, 然后回调函数中通过userInfo得到block,并运行。 改进: 这个已经是一个非常大改进了。...当然能够block中使用weak_self方式避免循环引用,可是写起代码来总是有些不顺手。并且还必需要外部使用者显式进行。 于是非常easy想到。应该封装到一个专门LPTimer类中。...而NSTimer运行block使用是weak_self。 它在timer触发时候调用自身doTimer方法。doTimer中负责将方法传递给外部使用者。...外部使用者能够将LPTimer看成是一个普通对象即可,持有它也不会有什么问题。 LPTimer保留一个弱引用指向外部使用者。时间到timer触发时候,会先调到NStimerblock中。...必须注意释放NStimer对象,LPTimer释放时候调用NSTimerinvalidate方法。

31110

系统框架--52:NSTimer保留其目标对象

NSTimer循环引用 创建定时器时,Student引用了定时器,在给定时器添加任务时,定时器保留了目标对象self,这里就出现了循环引用 #import <Foundation/Foundation.h...也就是合适时候调用end方法。然而,合适时机很难找到。假如这是一个验证码倒计时程序,你可以倒计时结束时调用end方法。...但是你不能确定用户一定会等倒计时结束才返回到上一级页面.或许你想在dealloc方法中使定时器失效,那你就太天真了。此时定时器还保留着当前控制器,此方法是不可能调用,因此会出现内存泄漏。...或许倒计时程序中,你可以重写返回方法,先调用end再返回,但这不是一个好主意 这里采用block块方法为NSTimer增加一个分类,具体细节看代码(程序员最好语言是代码)。...iOS10中,定时器API新增了block方法,实现原理和这一样,只不过我这里用是分类,而系统是原始类中直接添加方法,最终行为是一致 #import "Student.h" @implementation

11210

iOS对UIViewController生命周期和属性方法解析

这篇博客,旨在讨论UIViewController生命周期和属性方法,最基础东西上,往往会得到意想不到惊喜。...二、UIViewController生命周期         要了解UIViewController,先要弄清楚其生命周期。...面向对象语言中,是对象,就一定要有生命周期UIViewController也不例外,生命周期管理Controller作用范围和时间,也管理其内对象作用范围和时间。...1、parentViewController         UIViewController里面封装了一个数组,可以存放其子ViewController,系统中使例子就是导航和tabBar这类控制器...,还有一个属性可以设置弹出controler填充效果,但是这个属性只pad上有效,iphone上无效,都是填充到整个屏幕: @property(nonatomic,assign) UIModalPresentationStyle

2.9K20

2018 - iOS 面试题汇总一般面试题BAT面试题

weak storyboard 中添加一个控件引用关系是这样( UIbutton 为例): UIviewController -> UIview -> UIbutton 此时 UIviewController...) 添加到子控件也是强引用: UIbutton 就是添加到了 UIviewController view 上 8 预处 指令define 声明 个常数, 表明 中有多 少秒(忽 闰 问题... UIViewController 中重载 didReceiveMemoryWarning 方法。...为这种属性设置新值得时,设置方法既不保留新值,也不释放旧值。此特性同assign类似,然后属性所指对象遭到摧毁时,属性值也会清空(nil out)。 弱引用,不决定对象存亡。...如果可以尽量使用HTTPS,可以有效避免接口数据传输中被攻击。 35.main()之前过程有哪些 iOS中 main.m 是我们所熟悉程序入口。但是在在此之前其实程序以及做了很多事了。

6.4K30

Objective-C对象引用

一、引用 引用是iOS内存管理中重要知识点,总所周知,iOS对象内存管理是使用引用计数来表示。一个对象只有所有强引用都被释放后才能被回收。因此,一个对象生命周期取决于其强引用所有者。...某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象指针创建,而不是保留对象。...打破循环引用很简单,将其中一个指针改为弱引用 三、NSTimer引起循环引用 @interface DetailViewController () @property (nonatomic, weak...) NSTimer *timer; @end @implementation DetailViewController - (IBAction)fireButtonPressed:(id)sender...就是我们block中常用那种。

80820

定时器 你真的会使用吗?

iOS10.0 推出了两个新API,与上面的方法相比,selector换成Block回调、减少传入参数(那几个参数真是鸡肋)。不过开发中一般需要适配低版本,还是尽量使用上面的方法吧。...存在延迟 不管是一次性还是周期timer实际触发事件时间,都会与所加入RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性运算,timer就会被延时出发。...重复性timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定周期继续执行,这个延迟时间大概为50-100毫秒....需要注意是,该属性`targe`t`selector`被首次调用以后才会被赋值。...但如果调用方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会 - **适合做界面渲染** CADisplayLink可以确保系统渲染每一帧时候我们方法都被调用,从而保证了动画流畅性

93120

iOS APP运行时Crash自动修复系统

与此同时,如果NSTimer是无限重复执行一个任务的话,也有可能导致targetselector一直被重复调用且处于无效状态,对appCPU,内存等性能方面均是没有必要浪费。...那么解决NSTimer问题关键点在于以下两点: NSTimer对其target是否可以不强引用 是否找到一个合适时机,确定NSTimer已经失效情况下,让NSTimer自动invalidate...由上图流程可知,当NSTimer回调函数fireProxyTimer:被执行时候,会自动判断原target是否已经被释放,如果释放了,意味着NSTimer已经无效,此时如果还继续调用原有target...所以此时需要将NSTimer invalidate,然后统计上报错误数据。如此一来就做到了NSTimer合适时机自动invalidate。...同时还需要注意一点:因为zombie机制需要在对象释放时保留其指针和相关内存占用,随着app进行,越来越多对象被创建和释放,这会导致内存占用越来越大,这样显然对于一个正常运行app性能有影响。

3.2K1713

【iOS开发】 App 中加入 AdMob 广告 - 入门介绍与编程技巧

,可以上传身份证照片(我就是这样),然后Google会极速(我当时是几个小时)通过这个请求。...这是地址 ---- 横幅式广告与插页式广告 开发者App中加入广告时,要极力避免让用户感到非常厌烦。...,这段代码意思是让 UITableView 可滚动内容区域底部收缩,收缩长度为banner广告条高度。...如果你 UITableView 是存在于 UITableViewController 中,那么 UITableView frame 是不可调节,所以通过上面的代码,我们可以方便地避免广告遮挡原有的内容...而即便你 UITableView 是存在于 UIViewController,即这个 UITableView 是你自己添加进来,你可以任意调节 frame,我依然建议你用上面这种方法,而不是直接把

4.1K30

面试iOS 机会在自己手中

项目什么时候选择使用GCD,什么时候选择NSOperation 答: 项目中使用NSOperation优点是NSOperation是对线程高度抽象,项目中使用它,会使项目的程序结构更好,子类化NSOperation...设计思路,是具有面向对象优点(复用、封装),使得实现是多线程支持,而接口简单,建议复杂项目中使用。...项目中使用GCD优点是GCD本身非常简单、易用,对于不复杂多线程操作,会节省代码量,而Block参数使用,会是代码更为易读,建议简单项目中使用。 3....对象NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中时候, ScrollView滚动过程中会因为mode切换,而导致NSTimer将不再被调度...方法: 1、主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop特定mode(模式)中。

52951

打造自己内存泄漏检测工具

虽然 Xcode Instrucment 提供了 Leaks 和 Allocations 工具让我们能精准地定位内存泄漏问题,但是这种方式相对比较繁琐,需要开发人员频繁地去操作应用界面,触发泄漏场景...// 收集之后再统一处理,避免对每一个对象都进行 3s 检测 TDFLeakObjectProxyCollector *collector = [[TDFLeakObjectProxyCollector...,直接调用属性 getter 方法获取属性值,可能会触发属性懒加载,导致出现意料之外问题 (比如调用 UIViewController view 会触发 viewDidLoad),所以要通过 object_getIvar...比如 NSTimer / CADisplayLink 对象常见内存泄漏场景,除了 target 强引用控制器造成循环引用域外,还有一种是打破了循环引用但没有控制器销毁时执行 invalidate 操作...,因为 NSTimer 由 RunLoop 持有,不手动停止情况下,就会造成泄漏。

98730

《Effective Objective-C》干货三部曲(二):规范篇

可以避免循环引用:因为如果两个类自己头文件中都引入了对方头文件,那么就会导致其中一个类无法被正确编译。...而且要注意一下:如果替换式中存在运算符号,笔者经验最好用括号括起来,不然容易出现错误(有体会)。...第15条:用前缀 避免命名空间冲突 Apple宣称其保留使用所有"两字母前缀"权利,所以我们选用前缀应该是三个字母。 而且,如果自己开发程序使用到了第三方库,也应该加上前缀。...第52条: 别忘了NSTimer保留其目标对象 使用NSTimer时候,NSTimer会生成指向其使用者引用,而其使用者如果也引用了NSTimer,那么就会生成保留环。...像这种通过主动调用方法来打破保留设计显然是不好。 而且,如果通过回收该类方法来打破此保留环也是行不通,因为会将该类和NSTimer孤立出来,形成“孤岛”: ?

79310

《Effective Objective-C》干货三部曲(二):规范篇

可以避免循环引用:因为如果两个类自己头文件中都引入了对方头文件,那么就会导致其中一个类无法被正确编译。...而且要注意一下:如果替换式中存在运算符号,笔者经验最好用括号括起来,不然容易出现错误(有体会)。...第15条:用前缀 避免命名空间冲突 Apple宣称其保留使用所有"两字母前缀"权利,所以我们选用前缀应该是三个字母。 而且,如果自己开发程序使用到了第三方库,也应该加上前缀。...第52条: 别忘了NSTimer保留其目标对象 使用NSTimer时候,NSTimer会生成指向其使用者引用,而其使用者如果也引用了NSTimer,那么就会生成保留环。...而且,如果通过回收该类方法来打破此保留环也是行不通,因为会将该类和NSTimer孤立出来,形成“孤岛”: 孤立了类和它NSTimer 这可能是一个极其危险情况,因为NSTimer没有消失,它还有可能持续执行一些任务

89321
领券