首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTimer在UIView中禁用取消分配

NSTimer在UIView中禁用取消分配
EN

Stack Overflow用户
提问于 2011-04-15 06:25:48
回答 3查看 4K关注 0票数 9
代码语言:javascript
运行
复制
@interface someview:UIView{
  NSTimer* timer;
}
@end

@implementation someview

-(void)dealloc{
  NSLog(@"dealloc someview");
  [timer invalidate];
  timer = nil;
}
-(void)runTimer{
//
}
-(void)someMethod{

  timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
}

@end

释放某个视图不会调用dealloc,并且计时器会继续运行。

如果我注释掉"timer = [NSTimer schedule...“part,将调用dealloc。这意味着我的代码的所有其他部分都工作正常,而定时器是罪魁祸首。runTimer方法是空的,这意味着它只是定时器在干扰我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-15 06:30:53

NSTimer保留目标。因此,在取消分配视图之前,必须使计时器无效。

票数 14
EN

Stack Overflow用户

发布于 2011-05-20 02:54:24

我认为在UIView中使用NSTimer时最好的解决方案是覆盖removeFromSuperview方法;

代码语言:javascript
运行
复制
- (void)removeFromSuperview
{
    [timer invalidate];
    timer = nil;

    [super removeFromSuperview];
}

这里唯一要记住的是,您需要确保timer不是一个空对象,因为removeFromSuperview也可以从其他UIView的超级dealloc方法中自动调用。你可以用一个条件来检查。

票数 23
EN

Stack Overflow用户

发布于 2013-12-18 23:28:45

如上所述,计时器保留其目标。在计时器失效之前,在计时器和视图之间有一个保留周期,因此视图不会被释放。

当计时器从视图层次结构中移除时,我会通过对didMoveToSuperview进行子类化来使其无效,当存在与视图相关的更改(例如,superview更改)时,系统会调用这个子类化。仅当对UIView调用removeFromSuperview时才调用“removeFromSuperview”

代码语言:javascript
运行
复制
- (void)didMoveToSuperview
{
    [super didMoveToSuperview];

    if (!self.superview)
    {
        [timer invalidate];
        timer = nil;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5670431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档