什么是UICalloutBarButton,为什么它会导致我的应用程序崩溃?

7
我正在查看我的iPhone应用程序的一些崩溃报告,但以下问题让我束手无策。
很可能是在我的代码中某个事件处理程序调用了错误的选择器,导致崩溃。问题是我不知道这段代码在哪里 - 我不知道UICalloutBarButton或UICalloutBar是什么。
而且,不用说,我无法在我的设备上重现这个问题,否则就容易找到发生的位置了。
Date/Time:       2011-03-18 14:33:13.373 +0100
OS Version:      iPhone OS 4.3 (8F190)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x317aaa1c __pthread_kill + 8
1   libsystem_c.dylib               0x355593b4 pthread_kill
2   libsystem_c.dylib               0x35551bf8 abort
3   libstdc++.6.dylib               0x33378a64 __gnu_cxx::__verbose_terminate_handler() + 376
4   libobjc.A.dylib                 0x364b506c _objc_terminate
5   libstdc++.6.dylib               0x33376e36 __cxxabiv1::__terminate(void (*)()) + 46
6   libstdc++.6.dylib               0x33376e8a std::terminate() + 10
7   libstdc++.6.dylib               0x33376f5a __cxa_throw + 78
8   libobjc.A.dylib                 0x364b3c84 objc_exception_throw
9   CoreFoundation                  0x354e21b8 -[NSObject(NSObject) doesNotRecognizeSelector:]
10  CoreFoundation                  0x354e1642 ___forwarding___
11  CoreFoundation                  0x35458178 _CF_forwarding_prep_0 + 40
12  CoreFoundation                  0x3544befc -[NSObject(NSObject) performSelector:withObject:]
13  UIKit                           0x35e259b2 -[UICalloutBar buttonPressed:]
14  CoreFoundation                  0x3544befc -[NSObject(NSObject) performSelector:withObject:]
15  UIKit                           0x35e25cd4 -[UICalloutBarButton sendCallback]
16  Foundation                      0x31d096ce __NSFireDelayedPerform
17  CoreFoundation                  0x354b5a40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
18  CoreFoundation                  0x354b7ec4 __CFRunLoopDoTimer
19  CoreFoundation                  0x354b883e __CFRunLoopRun
20  CoreFoundation                  0x35448ebc CFRunLoopRunSpecific
21  CoreFoundation                  0x35448dc4 CFRunLoopRunInMode
22  GraphicsServices                0x328e8418 GSEventRunModal
23  GraphicsServices                0x328e84c4 GSEventRun
24  UIKit                           0x35bffd62 -[UIApplication _run]
25  UIKit                           0x35bfd800 UIApplicationMain
26  app name                        0x000022d0 main + 36
27  app name                        0x0000226c start + 44

首先要弄清楚什么时候出现崩溃:是在加载后立即发生,还是在执行某些操作后?使用NSLogs和断点来找出崩溃的位置。 - FeifanZ
我不知道它在哪里崩溃了...这是来自iTunes Connect的其中一个崩溃日志。我无法在我的端上重现它。 - alex_c
@Inspire48 崩溃报告上的断点?...我猜他无法重现那个错误,只有这一个报告。 - Vincent Guerci
当然可以在崩溃报告中设置断点...没意识到原帖只有崩溃报告。不用理会。 - FeifanZ
2个回答

6

UICalloutBar 是一个UIKit的私有API。

我认为这是出现在文本选择时的上下文菜单...(复制/粘贴...)

无论如何,这个崩溃似乎真的来自内部API。

所以我猜这可能是:

  • 苹果的bug(检查iOS版本与崩溃发生的频率)
  • 或者某个越狱设备上安装了不干净的扩展/调整,从而影响了内部API

恐怕你很难找到解决这个问题的方法。但我希望我是错的!:)


2
我也曾经遇到过这个API的崩溃问题。我允许我的tableView复制单元格,并自动显示上下文复制菜单。
当用户点击导航栏的返回按钮而不是点击菜单选项时,就会发生崩溃。菜单不会被解除,一直悬浮在窗口上,直到有人点击它。此时,UITableViewController子类从导航堆栈中弹出,导致消息发送到已释放的实例。
这可能是一个苹果UIKit的bug,我不确定。一个解决方法是在你的viewWillDisappear:方法中手动关闭菜单。
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[UIMenuController sharedMenuController] setMenuVisible:NO animated:animated];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接