我正在使用优秀的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
。现在一切似乎都正常。我是否创建了一个循环保留链?有更好的答案吗?
答案 0 :(得分:3)
Peter Hosey是对的 - 你应该使用Zombies来找到导致崩溃的确切原因。
然而,我的直觉告诉我(在查看TSAlertView.h之后),当您显示警报视图时,您将视图控制器设置为委托。您猜测似乎很可能,您的视图控制器正在被取消分配,并且警报视图正在尝试与悬空指针通信。
糟糕的是,如果您的控制器保留了AlertView,则可能会导致修复的保留循环。即使你没有,这种变化非常可能 导致一个保留循环,我不会成功。
好消息是,您仍然可以应用ARC之前的最佳做法,并且无法代表您的代表。在ARC下,dealloc仍然是一个有效的方法,当你的对象被释放时调用 - 你只是不调用super。这使您有机会在对象达到其生命结束时进行清理。如果在显示警报视图后保留对警报视图的引用,那么您应该可以执行类似以下操作来清理悬空指针:
- (void)dealloc {
self.alertView.delegate = nil;
}
答案 1 :(得分:0)
我还在尝试同时打开TSAlert时遇到此错误 [TSAlertView onKeyboardWillShow:]:发送到解除分配的实例的消息。 我的解决方案如下:
尝试做两个步骤:
希望它有所帮助,它对我有用。