1

我有一个视图,它是UIWebView的子类。它有一个名为Contact的属性,它是一个托管对象。该视图使用模板引擎创建包含对象的 html,然后加载到UIWebView中。我认为在视图本身中监视对象会是一个更好的主意,这样每当对象发生变化时,视图就会自动刷新。因此,在视图本身中观察托管对象的某些属性。然后为了避免通知合并,我已经完成了重新加载

[self performSelector:@selector(refresh) afterDelay:0 ].

它会在发现更改时自动刷新 webview,但也会出现一些奇怪的崩溃。崩溃显示 [MyWebView 保留] 消息已发送到已释放对象。我知道我已经正确删除了 dealloc 方法中的观察值。但是,似乎 dealloc 会在一段时间后被触发。我有一个与发布视图有关的奇怪问题。视图会停留一段时间,尽管视图控制器已经释放,然后在 2/3 秒后释放。这真的很奇怪。我认为崩溃是因为这个。

请建议我任何想法。我很高兴听到你的建议。肯定有问题,如果有人能指出我,我将不胜感激。

4

1 回答 1

0

如果使用不当,使用委托设计模式可能会导致 EXC_BAD_ACESS KERN_INVALID_ADDRESS 崩溃。如果您有在使用委托设计模式的后台线程中运行的处理,在您将 SELF 设置为委托的对象中,您必须通过将委托引用设置为nil,或者对象可能会尝试使用委托设计模式回调您已释放的对象。因此,如果您的对象中有类似的东西。

[_xmlParser setDelegate:self];

即使在 ARC 下,您也应该始终有一个 dealloc 方法,以防止在您的对象在仍在工作的同时被破坏的情况下发生崩溃的可能性。在工作时破坏您的对象是很常见的。想象一个 UIViewController 显示来自互联网的图像。如果你有一个 FetchImage 类,它使用委托设计模式来查找图像,然后在查找完成时调用对象上的例程,那么当 FetchImage 对象仍在工作时,用户很容易进出你的 UIViewController在后台线程上。测试时您可能不会注意到这一点,但如果您有数百个用户,其中一些用户会注意到,因为当您的对象尝试调用 SELF 引用上的方法时,应用程序将崩溃。

如果您的对象使用委托设计模式,请始终清理:

#pragma mark - dealloc - cleanup delegate references to prevent callbacks into deallocated objects (EXC_BAD_ACCESS / KERN_INVALID_ADDRESS)

- (void)dealloc
{
    [_xmlParser setDelegate:nil];
    // for non ARC based code you would also call: [super dealloc]; 
}

搜索项目中的每个类,如果您有 setDelegate:self 或 delegate = self 如果您没有如上所述的 dealloc 清理方法,那么您的用户很可能会遇到您的应用程序的竞争条件崩溃。如果您没有 dealloc,请添加它,即使您在测试时从未看到崩溃。-rrh

于 2014-01-09T20:28:54.760 回答