更换演示视图控制器时TSAlertView崩溃

时间:2013-02-07 19:37:45

标签: ios cocoa-touch uikit exc-bad-access uistoryboardsegue

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

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

一个明显的解决方法是增加当前UIViewController和新动画之间的动画持续时间,但这只会依赖于良好的时机,这是灾难的秘诀。是否有一种简单的方法可以阻止呈现UIViewController,直到TSAlertView被释放为止?{1}}被解除分配?主项目使用ARC而TSAlertView不是ARC。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

然而,我的直觉告诉我(在查看TSAlertView.h之后),当您显示警报视图时,您将视图控制器设置为委托。您猜测似乎很可能,您的视图控制器正在被取消分配,并且警报视图正在尝试与悬空指针通信。

糟糕的是,如果您的控制器保留了AlertView,则可能会导致修复的保留循环。即使你没有,这种变化非常可能 导致一个保留循环,我不会成功。

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

- (void)dealloc {
    self.alertView.delegate = nil;
}

答案 1 :(得分:0)

我还在尝试同时打开TSAlert时遇到此错误 [TSAlertView onKeyboardWillShow:]:发送到解除分配的实例的消息。 我的解决方案如下:

尝试做两个步骤:

  1. 为TSAlertView类添加-fno-objc-arc标志。有关说明,请访问:How can I disable ARC for a single file in a project?
  2. 添加行[[NSNotificationCenter defaultCenter] removeObserver:self];进入动画:^ 块下的TSAlertView类的 onKeyboardWillHide:方法。
  3. 希望它有所帮助,它对我有用。