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

标签 objective-c ios ios4

我在使用 NSTimer 对象时遇到了一个大问题。我无法解释自己的这种行为,我会尽力解释。

我认为有一个函数叫做 placeAdvertisement。在此函数中,有多个使用静态方法的操作,这些方法使用我的对象之一(另一个 View )作为参数:

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 ...];

}

最后一个计时器调用另一个函数,称为 quitAdvertisement,但他从未被调用(当产生故障时)。代码似乎在正常情况下运行良好,广告 Controller 工作正常,放置横幅,计时器调用 adsTimer,退出横幅。

如果弹出 View (返回)并再次推送另一个 View ,则会出现问题。加载 View 后,我按下一个按钮,触发之前放置的代码。代码执行的很好,但是在执行的“中间”,在[Advertisement operation1: self.adsController]出现EXC_BAD_ACCESS:

[MyController AdvertisementController]: 发送到释放实例 0x4e9b420 的消息

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

这怎么可能?有什么方法可以在更好的条件下进行调试吗?

我用过 NSZombieEnabled。

谢谢!

***对评论进行少量编辑***

  1. AdsController 的分配如下:

    self.adsController = [[AdsController alloc] initWithNibName:nil bundle:nil];

在 dealloc 方法之后:

[self.adsController release];

[super dealloc];
  1. 尊重计时器:

    分配了repeat NO。在 dealloc 之后:

    if (self.adsTimer != nil) [self.adsTimer 失效];

这是正确的吗?

最佳答案

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

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

关于objective-c - 不会失效的 NSTimer(或者我无法解决的奇怪的内存问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7370804/

相关文章:

ios - 将 CURL 转换为 Swift

iphone - 关于在 IOS 配置门户中命名应用程序 ID

iphone - 启动时在 iOS 中启动位置感知后台服务

iPhone - CC 大道

ios - Facebook整合iOS 7问题

iphone - 如何将带有 CAEmitterLayer 的 UIView 添加到我的游戏中?

objective-c - NSString substringWithRange 返回错误的子字符串

iphone - 委托(delegate)正在通过我的应用程序记录非公开事件 : can those events be detected?

ios - Bootstrap 字形图标显示错误的图像

ios - 委托(delegate)方法不能引用自己的类