0

我正在使用优秀的TSAlertView项目为有视觉障碍的人创建带有放大字体的弹出警报。不幸的是,我遇到了一个困扰我几天的问题。

TSAlertView当用户即将移动到应用程序中的新页面以确认当前页面的内容时,我正在使用作为验证器弹出窗口。即,用户按下按钮移动到应用程序中的新页面,TSAlertView屏幕上的弹出窗口,如果用户按下是按钮,则当前使用自定义segueUIViewController替换为不同的页面。UIViewController该应用程序随机崩溃,EXC_BAD_ACCESS我有根据的猜测是,当在完成其关闭动画UIViewController之前释放电流时,它会崩溃。TSAlertView

一个明显的解决方法是增加当前动画UIViewController和新动画之间的动画持续时间,但这仅仅依赖于良好的时机,这是灾难的根源。有没有一种简单的方法可以防止演示UIViewController被解除分配,直到TSAlertView被解除分配?主项目使用 ARC,TSAlertView而非 ARC。

编辑:橡皮鸭在行动。我在方法中添加了以下两行-(void) show

_presentingViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
[_presentingViewController retain];

release和中的一个对应-(void) dealloc。现在一切似乎都正常。我是否正在创建一个循环保留链?有更好的答案吗?

4

2 回答 2

3

Peter Hosey 是对的 - 你应该使用 Zombies 来找出导致崩溃的确切原因。

但是,我的直觉告诉我(在查看 TSAlertView.h 之后),当您显示警报视图时,您将视图控制器设置为委托。您的猜测似乎很可能,您的视图控制器正在被释放,并且警报视图正在尝试与悬空指针对话。

坏消息是,如果您的控制器保留了 AlertView,您的修复可能会导致保留循环。即使您没有,更改也极有可能导致保留循环,我不会成功。

好消息是,您仍然可以应用 ARC 之前的最佳实践,并取消您的代表。在 ARC 下,dealloc 仍然是在对象被释放时调用的有效方法——你只是不调用 super。这使您有机会在对象达到其生命周期的尽头时进行清理。如果您在显示后保留对警报视图的引用,那么您应该能够执行类似以下的操作来清理悬空指针:

- (void)dealloc {
    self.alertView.delegate = nil;
}
于 2013-02-12T07:56:17.290 回答
0

我也遇到了这个错误[TSAlertView onKeyboardWillShow:]: message sent to deallocated instance同时尝试打开 TSAlert。我的解决方案如下:

尝试执行 2 个步骤:

  1. 为 TSAlertView 类添加 -fno-objc-arc 标志。有关说明,请访问:如何为项目中的单个文件禁用 ARC?
  2. 添加行 [[NSNotificationCenter defaultCenter] removeObserver:self]; 进入onKeyboardWillHide:动画下TSAlertView类的方法:^块。

希望它有所帮助,它对我有用。

于 2014-01-18T09:22:08.857 回答