不会失效的 NSTimer(或我无法解决的奇怪内存问题)



我在NSTimer对象上遇到了一个大问题。我无法解释自己的这种行为,但我会尽我所能解释清楚。

我的视图中有一个名为placeadvertising的函数。在这个函数中,有多个使用静态方法的操作,这些方法使用我的一个对象(另一个视图)作为参数:

if (self.adsController == nil) {
    self.adsController = [[AdsController alloc] ...];
    [self.view addSubView: self.adsController.view;
}
if (banner != nil) {
    self.adsController.banner = banner;
    [self.adsController updateBanner];
    //If a previous timer is still working (because this method can be called multiple times) invalidate
    if (self.adsTimer != nil)
        [self.adsTimer invalidate];
    [Advertisement operation1: self.adsController];
    [Advertisement operation2: self.adsController];
    self.adsTimer = [NSTimer scheduledTimerWithTimeInterval: 5 ...];
}

最后一个计时器调用另一个名为quitadvertising的函数,但他从未被调用(当产生失败时)。代码似乎在正常情况下工作得很好,广告控制器工作正确,横幅被放置,计时器调用adsTimer,退出横幅。

如果弹出视图(返回)并再次推送另一个视图,则出现问题。加载视图后,我按下一个按钮,触发前面放置的代码。代码执行得很好,但是在中间"执行,在[Advertisement]中operation1: self。ex_bad_access:

[MyController AdvertisementController]: message sent to deallocated instance 0x4e9b420

就像在代码中间,我的对象被释放了。我没有任何代码调用对象的释放,只是dealloc,它没有被这个视图的实例调用(已经被上一个视图调用,它是弹出的)。

这怎么可能?有没有办法在更好的条件下调试?

我已经使用了NSZombieEnabled。

谢谢!

***注释的小编辑***

  1. AdsController的分配如下:

    自我。adsController = [[adsController alloc] initWithNibName:nil bundle:nil];

After in dealloc方法

[self.adsController release];
[super dealloc];
  • 关于定时器:

    它被分配了重复NO。After in dealloc:

    如果(自我。= nil) [self。

    adsTimer无效);
  • 正确吗?

    从发布的代码来看,当您'弹出'这个视图时,可能仍然有一个有效的NSTimer将保留其目标。你可以尝试在你的viewWillDisappear:方法中使NSTimer [[self adsTimer] invalidate]无效(假设你有一个viewController - ,如果你没有,我建议使用一个)。

    很难从您提供的代码中进行诊断-虽然简洁是很好的,但在这种情况下,更多一点可能会有所帮助。

    [NSTimer scheduledTimerWithTimeInterval]将定时器添加到当前运行循环中。如果当前线程是后台线程,则线程可能已经结束,并且计时器永远不会被触发。尝试在主运行循环中添加计时器。

    只是为了澄清问题所在。

    只有当定时器处于活动状态时才开始推送一个NSNotification。这让我相信问题出在计时器上,而不是被释放的表单捕获的通知开始。

    因此,当窗体弹出时,非常小心地从任何通知中删除观察者是很重要的。

    我只是想感谢你的帮助。

    相关内容

    • 没有找到相关文章

    最新更新