博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSTimer内存泄漏导致控制器不调用dealloc
阅读量:4497 次
发布时间:2019-06-08

本文共 1488 字,大约阅读时间需要 4 分钟。

创建定时器会在一定的间隔后执行某些操作,一般大家会这样创建定时器,这样创建的定时,self对定时器有个引用,定时器对self也有个引用,造成了循环引用,最终造成了内存泄漏,如果定时器在做下载的操作就会一直下载。

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

 解决办法:首先创建NSTimer的这样的一个分类:NSTimer+eocBlockSupports代码如下,可以看出它把定时器需要执行的操作放在了block这个参数中,返回一个定时器时block传给了userInfo ,执行定时器的操作时定时器获得userinfo的block执行block

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//
//  NSTimer+eocBlockSupports.h
 
 
#import <Foundation/Foundation.h>
 
@interface 
NSTimer 
(eocBlockSupports)<br>
//类方法返回一个NSTimer的实例对象
+(
NSTimer 
*)eocScheduledTimerWithTimeInterval:(
NSTimeInterval
)timeInterval block:(
void
(^)()) block repeats:(
BOOL
)repeat;
@end
 
 
//
//  NSTimer+eocBlockSupports.m
 
 
#import "NSTimer+eocBlockSupports.h"
 
@implementation 
NSTimer 
(eocBlockSupports)
+(
NSTimer 
*)eocScheduledTimerWithTimeInterval:(
NSTimeInterval
)timeInterval block:(
void
(^)()) block repeats:(
BOOL
)repeat{
    
return  
[
self 
scheduledTimerWithTimeInterval:timeInterval target:
self 
selector:
@selector
(startTimer:) userInfo:[block 
copy
] repeats:repeat];
}
//定时器所执行的方法
+(
void
)startTimer:(
NSTimer 
*)timer{
    
void
(^block)() = timer.userInfo;
    
if 
(block) {
        
block();
    
}
     
}
@end

 NSTimer的分类创建完成后,创建定时的代码如下:一定要弱化self否则还是无法解决循环引用的问题。

   __weak typeof(self)weakSelf = self;

    self.timer = [NSTimer eocScheduledTimerWithTimeInterval:1.0 block:^{

        [weakSelf startTimer];

    } repeats:YES];

转载于:https://www.cnblogs.com/bigshow1949/p/5642496.html

你可能感兴趣的文章
Android之Adapter用法总结-(转)
查看>>
总结列表显示ListView知识点
查看>>
android 教程实例系列
查看>>
lucene笔记
查看>>
tomcat无法正常shutdown
查看>>
zookeeper + dubbo 搭建
查看>>
根据前序遍历和中序遍历求出二叉树并打印
查看>>
UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
查看>>
Delphi的命令行编译命令
查看>>
BZOJ 1901 Zju2112 Dynamic Rankings 题解
查看>>
C++虚析构函数
查看>>
《玩转.NET Micro Framework 移植-基于STM32F10x处理器》--微软中国.NET Micro Framework项目组工程师所作之序...
查看>>
php服务端搜索,功能改进
查看>>
unity, 在surface shader中访问顶点色
查看>>
Spring声明式事务配置
查看>>
并查集的实现
查看>>
Leetcode 350. Intersection of Two Arrays II
查看>>
EditPlus VC2010 and 2008 C/C++配置
查看>>
Practical Lessons from Predicting Clicks on Ads at Facebook
查看>>
JFrame面板
查看>>