UIView子类未被释放

dev*_*oug 2 nstimer uiview objective-c-2.0 ios

我有一个子类UIView,它没有被释放.我知道只有一个类正在创建我的视图实例.我认为我有一个NSTimer ivar.如果我注释掉该计时器,当我点击此视图控制器上的取消按钮时,将调用此视图中的dealloc.如果我没有注释掉计时器,则永远不会调用dealloc.

//CustomUIView
- (id) initWithFrame:(CGRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) {
        _pollTimer = [[NSTimer scheduleTimerWithTimeInterval:0.2 target:self selector:@selector(onPollTimerFired:) userInfo:nil repeats:YES] retain];
    }
}
Run Code Online (Sandbox Code Playgroud)

我想保留对此计时器的引用,因为有时我希望暂停计时器.现在,我可以在我的计时器视图上有一个属性,并且在类的dealloc方法中引用了我的自定义uiview,我可以在释放所述视图之前使其无效.我真的不喜欢这种方法,因为我不想将这个计时器暴露给外部实体.

有人有主意吗?

ric*_*ter 6

NSTimer始终保持目标.这有两个含义:

  1. 您不应该让视图(这是计时器的目标)保留计时器,因为这将创建一个循环.

  2. 只要计时器保持活动状态,您的视图将永远不会被释放.

相反,invalidate只要您的视图完成,就应该调用计时器.完成此操作后,视图将dealloc在其引用计数变为零时进行.

通常,当从其超级视图中删除视图时会发生这种情况; 如果你希望它继续使用它的计时器直到发生这种情况然后被释放,你可以覆盖removeFromSuperview以使计时器无效然后调用super.