UIAlertView的私有方法崩溃

时间:2012-03-23 15:27:03

标签: iphone ios ipad uialertview

我在其中一个应用程序中看到一个奇怪的崩溃,似乎来自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是正确的 - 我的代码的行号是正确的,例如

有人对此有任何想法吗?

编辑:应该补充一点,这是在带有实时应用的字段中发生的,但只是偶尔发生。它已经影响了大约一千个左右的用户,但我无法在设备上或模拟器中重现它。

1 个答案:

答案 0 :(得分:0)

看起来你在发布警报视图后调用了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];
}