我在使用 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。
谢谢!
***对评论进行少量编辑***
AdsController 的分配如下:
self.adsController = [[AdsController alloc] initWithNibName:nil bundle:nil];
在 dealloc 方法之后:
[self.adsController release];
[super dealloc];
尊重计时器:
分配了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/