UIAlertView 的私有方法崩溃

Posted

技术标签:

【中文标题】UIAlertView 的私有方法崩溃【英文标题】:Crash on private method of UIAlertView 【发布时间】:2012-03-23 15:27:03 【问题描述】:

我在我的一个应用程序中看到一个奇怪的崩溃,它似乎来自 UIAlertView 上的一个私有方法。我进行了一些搜索,发现其他一些关于这种方法的引用涉及崩溃,例如here,但我不相信原因是相同的。但是要确定我总是将 UIAlertView 委托设置为 nil 每当委托被解除分配。

堆栈跟踪如下:

Exception Type:  SIGABRT
Exception Codes: #0 at 0x351ce32c
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_kernel.dylib              0x351ce32c __pthread_kill + 8
1   libsystem_c.dylib                   0x370c329f abort + 95
2   eLogbook                            0x000bbacd -[GetOperationPartsDictionary init] (GetOperationPartsDictionary.m:22)
3   UIKit                               0x32557f93 -[UIAlertView(Private) _popoutAnimationDidStop:finished:] + 855
4   UIKit                               0x3240dc53 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 471
5   UIKit                               0x3241357d -[UIViewAnimationState animationDidStop:finished:] + 53
6   QuartzCore                          0x36eeac2f CA::Layer::run_animation_callbacks(void*) + 203
7   libdispatch.dylib                   0x3140ae91 _dispatch_main_queue_callback_4CF$VARIANT$up + 197
8   CoreFoundation                      0x353ad2ad __CFRunLoopRun + 1269
9   CoreFoundation                      0x353304a5 CFRunLoopRunSpecific + 301
10  CoreFoundation                      0x3533036d CFRunLoopRunInMode + 105
11  GraphicsServices                    0x3662c439 GSEventRunModal + 137
12  UIKit                               0x32426e7d UIApplicationMain + 1081
13  eLogbook                            0x0007767f main (main.m:14)

真正让我困惑的是-[UIAlertView(Private) _popoutAnimationDidStop:finished:] 方法似乎正在调用我的GetOperationPartsDictionary 类的init 方法。从我从用户那里获得的有限信息来看,这个崩溃是在启动时发生的,此时该类不会被加载。

我正在使用 QuincyKit 将崩溃报告传送到服务器,然后使用标准 symbolicatecrash 脚本对它们进行符号化。用于表示崩溃的 Xcode 版本与用于构建二进制文件的版本相同,我相信用于表示崩溃的 dSYM 是正确的版本 - 例如,我的代码的行号是正确的.

有人对此有什么想法吗?

编辑:应该补充说,这是在现场应用程序中发生的,但只是偶尔发生。它影响了大约一千个用户中的一两个用户,但我从来没有能够在设备上或模拟器中重现它。

【问题讨论】:

查看我过去跟踪 sigabrt 错误的问题。在答案之后专门阅读 cmets 以在任何异常上使用断点。 ***.com/questions/8072135/… 谢谢,但我应该提到我自己无法在模拟器或设备上重现此问题,我刚刚修改了原始问题。因此断点不会有帮助:( @yod 发布一些代码,以便我们为您提供帮助。 【参考方案1】:

看起来您在警报视图发布后调用了 UIAlertViewDelegate。

只在 dealloc 方法中释放它:

-(void)dealloc 
    self.alertView.delegate = nil; //setting delegate to nil
    self.alertView = nil; //if you have defined alert as property
    //other release statements of your controller
    [super dealloc];

【讨论】:

以上是关于UIAlertView 的私有方法崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView 在未记录的方法上崩溃

uialertview 中的图像...?

UIAlertView 和 UIAlertController

IOS UIAlertController 使用方法

iOS5:有人设法用三个按钮和文本字段(UIAlertViewStylePlainTextInput)修复 UIAlertView 吗?

显示 UIAlertView 时崩溃