使用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并不是一个很好的选择;大家在使用时需要多多注意,避免踏坑。
使用NSTimer过程中最大的两个坑的更多相关文章
- 聊一聊 MySQL 中的数据编辑过程中涉及的两阶段提交
		MySQL 数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊 MySQL 数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新.删除.新增等),两阶段提交过程中涉及到了 MySQL 数 ... 
- jenkins配置过程中踩过的一些坑
		1,编译通过之后,想要将编译好的war包放到远程服务器上,并解压 unzipBus.sh的脚本如下: #!/bin/bash jar -xvf bus.war 编译后报错:jar:Command no ... 
- 细数阿里云在使用 Docker 过程中踩过的那些坑
		昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了.我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器. 美国中部时间4月19日,阿里云在容器 ... 
- redux使用过程中遇到的两个致命的关键点
		一.在reducer中,返回的state必须是全新的对象,否则,redux不会执行listening方法,因为redux会认为state没有更新过,没必要重新渲染view. 出现问题的例子: cons ... 
- Matlab高级教程_第二篇:关于MATLAB转C#过程中遇到输出两组参数的问题
		1. 在matlab的m函数很可能遇到原函数[a,b] = func(a); 这样的两个输出参数. 2. 在观察C#生成后定义中我们发现: public MWArray HP(); public MW ... 
- 安装K/3 Cloud过程中发现的两个新问题。
		卸载掉K/3 Cloud然后重装时出现下面的错误提示: 可能原因: 1.安装目录下的Setup.exe会检查操作系统版本.有些操作系统可能是被串改过注册信息,所以取不到版本信息(有些是因为盗版的原因) ... 
- k8s 实验过程中遇到的两个小问题 端口 和 批量删除Error的pods
		1. 自己kubeadm搭建的一套k8s系统 然后进行做实验 发现了几个问题 jenkins 创建 salves的时候总是有问题. 提示注册不上 然后 我修改了下yaml文件 暴露端口 50000 ... 
- 记一次使用dubbo过程中版本冲突导致的坑
		前言:2019年09月23日临下班,产品的一个变更需求临近尾声阶段.本地测试OK,兴致冲冲的想着发布到测试环境,验证一下没有问题,五分钟结束战斗,明天就开始下个需求了.随在CE(公司的devOps系统 ... 
- iOS 集成支付宝过程中 我遇到的一些坑,请大家注意啦(ALI69错误,ALI64错误)
		支付宝很早一段时间就集成了,之前由于一直忙于开发就没有总结,今天整理桌面的时候看到,当时做支付时候的一些散落的笔记,就稍微整理一下,给大家分享一下. 第一:当时调用支付宝的时候,总是调不起来,进过断点 ... 
随机推荐
- Spring的事件和监听器
			Application下抽象子类ApplicationContextEvent的下面有4个已经实现好的事件 ContextClosedEvent(容器关闭时) ContextRefreshedEven ... 
- CAD 快捷键Ctrl+2   Ctrl+3
			今天用cad,学习了两个快捷键,第一个Ctrl+2,打开如下 第二个是Ctrl+3,打开如下: 
- POJ1780 Code(欧拉路径)
			n位密码,要用尽可能短的序列将n位密码的10n种状态的子串都包括,那么要尽量地重合. 题目已经说最短的是10n + n - 1,即每一个状态的后n-1位都和序列中后一个状态的前n-1位重合. 这题是经 ... 
- 【LINUX/UNIX网络编程】之使用SOCKET进行UDP编程
			先看任务需求: 实验二 UDP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本UDP通讯,实现服务器与客户端的文件传送 [实验学时] 4学时 [实验内容] ... 
- 打包apk
			apk 配置环境变量 打开"终端",输入"pico .bash_profile"命令 export ANDROID_SDK_ROOT=/Users/sun/Do ... 
- BZOJ3571 : [Hnoi2014]画框
			题目是要求最小乘积最小权匹配, 将一种方案看做一个二维点(x,y),x=a值的和,y=b值的和,所有方案中只有在下凸壳上的点才有可能成为最优解 首先要求出两端的方案l,r两个点 l就是a值的和最小的方 ... 
- 《为ipad而设计 打造畅销APP》读书笔记
			(1)应用应该对用户程序持ipad的变化做出响应 (2)要设计出确实出色的触摸屏交互界面需要能够触摸到自己的设计,反复触摸,直到找到感觉 (3)chipmunk physics 2D的物理图形库 (4 ... 
- topcoder SRM 593 DIV2 WolfDelaymaster
			#include <iostream> #include <string> #include <algorithm> using namespace std; cl ... 
- TYVJ P1088 treat Label:鞭笞人的DP
			时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 广东汕头聿怀初中 Train#2 Problem2 描述 给出长度为N的数列{A_i},每次可以从最左边或者最 ... 
- POJ 3034 Whac-a-Mole(DP)
			题目链接 理解了题意之后,这个题感觉状态转移还是挺好想的,实现起来确实有点繁琐,代码能力还有待加强,经过很长时间才发现bug.注意坐标可能是负的. #include <cstdio> #i ... 
