使用NSTimer过程中最大的两个坑

坑1. retain cycle问题。

在一个对象中使用循环执行的nstimer时,若希望在对象的dealloc方法中释放这个nstimer,结局会让你很失望。

这个timer会导致你的对象根本不会被释放,所以不会调用dealloc方法,同时这个nstimer也永远不会停止。

解决方案:

a. 变更你的意图,在对象被释放之前你如果能保证触发timer的invalidate,那么你可以避免这个问题。

b.给你的对象加一个weak的代理,让这个代理去当冤大头,供timer去强引用;同时这个代理不会持有你的对象,这样就解除了retaincycle.

一个weak代理的实现参考: yykit的yyweakProxy. https://github.com/ibireme/YYKit/blob/master/YYKit/Utility/YYWeakProxy.h

c. 使用其他方法来实现循环执行,比如gcd的方法(gcd还有另外的好处,比如精度;nstimer是依赖runloop的,触发时机和runloop有关)。

坑2.在子线程中的使用。

在子线程中使用NSTimer是需要特别处理的;否则你会发现你的timer方法很可能永远不被触发。

这个坑还是跟runloop有关;nstimer是依赖于runloop的,默认创建的子线程一般没有在运行中的runloop;这样一来你的timer变成了无源之水,也就歇菜了。

解决方案:

a.为你的线程添加runloop,并启动该runloop

b.手动将timer添加到runloop(例):

[[NSRunLoop currentRunLoop] addTimer:timer1 forMode:NSRunLoopCommonModes];

结语:NSTimer重复执行时因为被runloop强引用,同时其又会强引用timer方法所在的对象,所以存在了这个retain cycle问题;

同时也因为其依赖于runloop,所以在线程中运行需要额外设置。

另外,因为runloop的触发机制也限制了它的精度,所以综合来看,对于一个高要求的定时处理,nstimer并不是一个很好的选择;大家在使用时需要多多注意,避免踏坑。

时间: 2024-08-05 08:40:34

使用NSTimer过程中最大的两个坑的相关文章

细数阿里云在使用 Docker 过程中踩过的那些坑

昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了.我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器. 美国中部时间4月19日,阿里云在容器技术大会 DockerCon 2017上正式推出了 Apsara Stack Agility,也就是飞天的敏捷版.Docker 公司首席执行官 Ben Golub 在大会上宣布了 Apsara Stack Agility 的正式发布,这也是国内第一个支持 Docker 官方企业版(Enterpris

最近移动前端项目中遇到的两个坑

尽管要多加避免,但还别说,坑还真得常踩常有,不要以为手机端都是 Webkit 的天下就简单,不用处理浏览器之间的兼容问题,--其实不一致性的问题还是挺大的. 两个坑都是涉及 iframe 的--iframe 真是不好搞! 事情是这样的,一个内嵌于 iframe 的页面,因为需要从认证接口中返回 token 作为登录凭证,读取接口信息是没问题的,然后需要用 session 把登录信息保存起来.奇怪的是,session 无效,就像丢失了一样!脱离了 iframe 就是单独页面的话就没事.而且不是全部

impdp导入中碰到的两个问题

前两天,需要将远程一个测试库用expdp导出的数据dump导入到本地的一个测试环境中,其中碰到了一些问题,值得小结下. 环境介绍: 1. 数据量:10+表,<1000万的数据,dump文件大约400多MB 2. 源库和目标库都是11.2.0.4 3. 字符集不同,源库字符集是GBK,目标库字符集是UTF-8 导入命令: test/test directory=exp_dump dumpfile=test.dmp logfile=test.log remap_schema=test1:test2

无线路由器拨号过程中可能会遇到的问题以及解决方法

在使用无线路由器拨号的过程中总会遇到这个那个的问题,也许你不会不知道如何解决,在这里就为大家列出可能会发生的问题的以及解决的方法! [问题] 用户用QUIDWAY路由器连接时广域网口的PPP协议不通,判断问题所在. [解决]:PPP协议属ISO二层协议,所以判断问题所在要从第一层起判断,用show in s N (N为所用串口)查看底层DTR,DSR,RTS,CTS,DCD信号是否都UP, 如不是,说明DTE与DCE间物理线路没连好,查一下连接电缆问题,当串口提示UP且无错帧时,说明物理层正常.

数据库异常膨胀-SQLSERVER数据同步过程中,数据库急速,异常膨胀!

问题描述 SQLSERVER数据同步过程中,数据库急速,异常膨胀! 两台服务器A,B上的sqlserver需要同步两个表的数据,B中的某两张表数据要保持和A中的一样,第三方系统会没5分钟想A中插入一些新的数据.这里我采用了快照方式在A中发布要同步的两张表的数据,没两分钟更新一次快照,在服务器B上订阅A发布的数据.数据同步看起来都是没问题的,B中会得到A的新数据,可是一个月不到,B中对应的数据库文件竟然已经从原来的1G多一点的样子达到100+G,几乎要超过磁盘的最大容量,而我看A中的数据库文件大小

ios后台运行-Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决

问题描述 Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决 公司目前在做一个voip网络电话的项目,底层的库是用的sip.我是负责写上层app的,底层的库都是封装在.a的静态库里面.我看不到底层的实现内容. 我以前有实现过在后台一直运行,但是这个项目怎么弄都弄不出来,有各种问题.由于公司的帐号是个人帐号,需要上架审核.我有以下问题,希望大家有会的能帮忙回答一下.谢谢大家.我现在是用xcode5,然后是用ios7的4s来写程序测试. 1.这个类似网络电话的app,如果需要上架

网站外链建设过程中的一些细节汇总

无论什么时候,外链始终是网站优化的必要组成部分,所以想要学好SEO就必须掌握外链建设的一些技巧.其实搜索引擎判定一个网站的权重高低,很大一部分因素是取决于其他网站权重的传递,或者称之为投票.当然了这里所说的是有效权重传递,与之对应的就是一些垃圾外链,外链建设最忌讳的就是漫无目的的发一下垃圾外链.下面笔者就根据自己多年的优化经验,给大家详细介绍下外链到底应该怎么发以及外链建设过程中的一些细节处理. 1.友情链接 无论大型门户网站,还是很小的个人博客,友情链接都必不可少.每多一个友情链接,就相当于网

SEO优化过程中经常被忽略的细节

很多新手SEOER在网站优化过程中,经常会忽略一些细节,而正是由于这些细节没有处理恰当,导致网站两三个月都没有排名.在长期的工作实践中,我总结出来主要有以下三点: 1.死链接的处理 死链接就是无效路径.如果死链接没有被处理过,那么当用户访问这条死链接的时候,网站就会显示默认的错误页面给用户,这个页面叫做404页面.默认未经设置的404页面对于用户而言是不友好的,会大大增加用户的跳出率.因此,我们有必要设置一个适合网站的404页面,该页面的功能是将用户引导回我们的网站.处理完影响用户体验的404页

互联网产品优化过程中的经验

文章描述:互联网产品优化经验分享. 产品上线后,无论是否达到预期,都有非常大的优化空间,以下列一些产品优化过程中的经验,仅供参考: 一.建立产品监控体系 从宏观上来看产品要关注的大的点,并把其拆开,如果能实时监控最好,不能实时的全部放在报表中,每天看一次也可以,从中可以发现产品在大的点上是否出了问题! 举例:邀请回来的用户,有多少成功注册了,这里可以设置成一个转化率,如果某个点突然有较大的变化,能及时发现. 这里为什么说只列大的点呢!如果切分开,点就太多了,在作局部优化时可以把大点切分成小的点来