[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:NO陷阱

对于

NSTimer* refreshTimer_ = [NSTimer scheduledTimerWithTimeInterval:fSearchNewAlarmTimer target:self selector:@selector(requestNewMessage) userInfo:nilrepeats:YES];
[refreshTimer_fire];

我们常用的释放方式:

if (refreshTimer_ !=nil) {
        [refreshTimer_invalidate];
        refreshTimer_ =nil;
}


如果repeats:NO,上面的释放方式会crash,原因是违背谁retain谁释放的原则,


解决方法:

方法1:直接refreshTime_ = nil;

方法2:判断是否健在,再释放

1)创建定时器

BOOL bRunTimerFuncFlag =NO; // timer函数执行标志
NSTimer* refreshTimer_ = [NSTimer scheduledTimerWithTimeInterval:fSearchNewAlarmTimer target:self selector:@selector(requestNewMessage) userInfo:nil repeats:YES];
[refreshTimer_ fire];

2)定时器函数

-(void)requestNewMessage
{
    bRunTimerFuncFlag =YES;
}

3)释放

if (! bRunTimerFuncFlag) {
        [refreshTimer_ invalidate];
        refreshTimer_ =nil;
 }


参考文章:

http://stackoverflow.com/questions/5191272/iphone-do-i-need-to-invalidate-timer-when-repeats-no

http://stackoverflow.com/questions/6038698/nstimer-to-retain-or-not-to-retain

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值