社区
iOS
帖子详情
NSTimer的释放问题
NAUYNUJUG
2018-03-06 03:37:08
app的功能要求能在页面里按钮打开后台的定时循环任务一直后台运行,然后继续其他操作,包括离开当前页面啊等等,到时需要停止的时候就再回到页面结束,我是用的NSTimer来实现循环任务,但是在网上了解的都是需要在离开页面时就释放NSTimer,否则会内存泄漏云云,请问这个该怎么解决,如何能实现后台循环任务还能离开当前页面,后面还能释放这个定时器?
...全文
1237
5
打赏
收藏
NSTimer的释放问题
app的功能要求能在页面里按钮打开后台的定时循环任务一直后台运行,然后继续其他操作,包括离开当前页面啊等等,到时需要停止的时候就再回到页面结束,我是用的NSTimer来实现循环任务,但是在网上了解的都是需要在离开页面时就释放NSTimer,否则会内存泄漏云云,请问这个该怎么解决,如何能实现后台循环任务还能离开当前页面,后面还能释放这个定时器?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
铘少偌夢
2018-11-15
打赏
举报
回复
这个问题最主要的重点是释放的时机,比如当任务完成后就释放NSTimer,可以在NSTimer的循环方法中去判断任务完成的时机,当完成时就释放NSTimer。例如下面的代码,偏移时间和时间节点的比较: if (self.timeOffset >= self.duration) { [self.timer invalidate]; self.timer = nil; }
ShenYj_4
2018-10-09
打赏
举报
回复
楼上基本都补充到了 我在汇总一下: 1. 这个NSTimer在这种场景下,不适合放在页面里了, 应该放在一个生命周期更长的类中 2. 指望定制器实现后台是没戏了, 支持后台的功能很多,比如:音频、蓝牙、定位。。。,可以结合业务配合其中一种功能开启后台模式
weixin_41694952
2018-09-29
打赏
举报
回复
实现一个全局类,这个类不能做其他任何事情,只是持有这个NSTimer。 当你第一次进入这个页面的时候,初始化该全局类,自动创建NSTimer,并执行,此时NSTimer和全局类绑定,和页面没有关系 当你不需要NSTimer时,释放该全局类,并在全局类的dealloc方法里调用NSTimer 的 invalidate 函数,完成对NSTimer的释放 为什么能释放? 因为NSTimer的delgate是Strong类型的,之所以会引起内存泄漏,是因为当你在页面里强引用NSTimer时,NSTimer的delegate又强引用了页面,所以才会出现内存泄漏。
大飞哥666
2018-03-13
打赏
举报
回复
你需要解决2个问题: 1.是如何保证NSTimer不被释放。楼上的朋友已经帮你解决了,将NSTimer放到不会被销毁的类里边,比如AppDelegate。 2.你需要保证你的APP在后台能够一直运行。正常情况下,你进入后台,APP就会被挂起,所以你需要解决一下这个问题。可以参考我的博客,里边有一篇正好是介绍APP后台运行的文章。 希望能帮助到你。
不担心
2018-03-12
打赏
举报
回复
"app的功能要求,能在页面里,按钮打开后台的定时循环,任务一直后台运行" 应该是这个意思吧,整个看下来没有特别的地方啊,你可以把NSTimer放在类似AppDelegate的公共类里就和你的页面没关系了啊,在AppDelegate里定义一个NSTimer,在启动的时候初始化他,但不要运行,然后在你需要控制的页面,比如A中点击了按钮再启动NSTimer,这时候A你要关闭要干嘛都不影响timer,要关闭的话回到A页面关闭,没有问题
iOS
NS
Timer
循环引用的几种解决办法
发生场景 在 Controller B 中有一个
NS
Timer
@property (strong, nonatomic)
NS
Timer
*
timer
; 你创建了它,并挂载到 main runloop self.
timer
= [
NS
Timer
scheduled
Timer
WithTimeInterval:1 target:self selector:@selector(
timer
Action:) userInfo:nil repeats:true]; 然后退出 Controller B 的时候,忘记关掉
timer
了 Controller B 将不会
释放
,B 与
timer
循环
RJWeakTime:RJWeak
Timer
是一个可以自动
释放
的
NS
Timer
,因此您不必担心
NS
Timer
内存泄漏
RJWeakTime RJWeak
Timer
是可以自动
释放
的
NS
Timer
,因此您不必担心
NS
Timer
内存泄漏。 Design I
ns
tall pod 'RJWeakTime' Usage self.
timer
= [RJWeakTime scheduled
Timer
WithTimeInterval:1.0 target:self selector:@selector(cb:) userInfo:@{@"key":@"test"} repeats:YES]; Important 创建的RJWeakTime实例对象需要用 strong 类型的属性或者成员变量来定义
RDRIntermediateTarget:防止由
NS
Timer
,
NS
Thread或CADisplayLink实例引起的保留周期的替代方法
RDRIntermediateTarget 一个项目,演示如何使用Objective-C的消息传递功能来防止由于与
NS
Timer
,
NS
Thread或CADisplayLink实例进行交互而导致的保留周期。 介绍 您可能已经知道,
NS
Timer
,
NS
Thread和CADisplayLink实例保留其目标。 如果目标也保留这些类之一的实例,则我们有一个保留周期:目标和实例都不会被
释放
。 您为什么要保留这些类之一的实例? 假设您有某种需要使用CADisplayLink实例的视图动画。 动画完成后,就不再需要CADisplayLink实例,应该暂停该实例,以防止您的应用占用资源。 为了暂停它,您将不得不保留对其的引用。 在这一点上,您可能会感到奇怪:为什么不保留对实例的弱引用而不是对实例的强引用? 这不能解决我们所有的
问题
吗? 答案是否定的,因为它不会改变保留目标的事实。 例如,对
ZHWWeak
Timer
-master.zip
解决iOS中使用
NS
Timer
定时器,无法调用dealloc方法,导致引用对象无法
释放
,造成循环引用的
问题
。
IOS 常见的循环引用总结
IOS 常见的循环引用总结 介绍: 循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 举个例子:A->B->C->….->X->B ->表示强引用,这样的B的引用计数就是2,假如A被系统
释放
了,理论上A会自动减小A所引用的资源,就是B,那么这时候B的引用计数就变成了1,所有B无法被
释放
,然而A已经被
释放
了,所有B的内存部分就肯定无法再
释放
再重新利用这部分内存空间了,导致内存泄漏。 情况一:delegate Delegate是ios中开发中最常遇到的循环引用,一般在声明delegate的时候都要使用弱引用weak或者assign
iOS
29,027
社区成员
12,466
社区内容
发帖
与我相关
我的任务
iOS
主要讨论与iOS相关的软件和技术
复制链接
扫一扫
分享
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章