【问题标题】:iOS app crashing in Core Location callback machineryiOS 应用在 Core Location 回调机制中崩溃
【发布时间】:2011-07-09 21:46:50
【问题描述】:

我在分析崩溃日志时遇到问题。当我单击应用程序图标启动应用程序时,iPhone 有时会崩溃。该应用程序已在后台“运行”,但未处于活动状态。这是符号化的崩溃日志:

Thread 0 Crashed:
0   libobjc.A.dylib     0x33479470 objc_msgSend + 28
1   CoreLocation                    0x3436f68e -[CLLocationManager onClientEvent:supportInfo:] + 98
2   CoreLocation                    0x3436f804 OnClientEvent + 16
3   CoreLocation                    0x3436b522 CLClientInvokeCallback(__CLClient*, CLClientEvent, __CFDictionary const*) + 42
4   CoreLocation                    0x3436cf74 CLClientHandleDaemonDataRegistration(__CLClient*, CLDaemonCommToClientRegistration const*, __CFDictionary const*) + 668
5   CoreLocation                    0x3436d4c8 CLClientHandleDaemonData(__CFMessagePort*, long, __CFData const*, void*) + 212
6   CoreFoundation                  0x33a813fe __CFMessagePortPerform + 242
7   CoreFoundation                  0x33a556f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
8   CoreFoundation                  0x33a556bc __CFRunLoopDoSource1 + 160
9   CoreFoundation                  0x33a47f76 __CFRunLoopRun + 514
10  CoreFoundation                  0x33a47c80 CFRunLoopRunSpecific + 224
11  CoreFoundation                  0x33a47b88 CFRunLoopRunInMode + 52
12  GraphicsServices                0x33b0e4a4 GSEventRunModal + 108
13  GraphicsServices                0x33b0e550 GSEventRun + 56
14  UIKit   0x32099322 -[UIApplication _run] + 406
15  UIKit                           0x32096e8c UIApplicationMain + 664
16  Norddeich                       0x00002764 main (main.m:14)
17  Norddeich                       0x00002718 start + 32

据我了解堆栈跟踪,错误发生在 main.m 中。第 14 行是默认代码的一部分:

int retVal = UIApplicationMain(argc, argv, nil, nil);

请给我一个提示,如何找到错误。
提前谢谢!

【问题讨论】:

  • 似乎CLLocationManager 中的某些代码正在崩溃。您是否在应用中使用位置跟踪?
  • 嗨,奥莱!是的,我使用位置跟踪。我在 AppDelegate 中有一个 CLLocationManager,我从 didFinishLaunchingWithOptions 方法开始。每次使用需要位置的视图控制器时,我都会将视图控制器设置为 CLLocationManager 的委托,以便使用适当的 didUpdateToLocation 方法。这个可以吗?谢谢!
  • 进入后台时是否设置delegate为nil?如果不是,则已设置为委托的视图控制器可能已被释放,这将导致崩溃。此外,您需要查看崩溃日志的顶部以了解它发生的位置。如果崩溃发生在线程 0 上,那么您的 main 函数将始终位于回溯的底部。

标签: iphone cocoa-touch ios core-location crash-log


【解决方案1】:

我在 4.3 上测试我的应用时遇到了同样的问题,但在 5.0 中没有。问题是我试图在委托方法之一中释放 CLLocationManager。它在 5.0 中运行良好,但每次运行 4.3 的 iPhone 3GS 都会崩溃。

最后我将 CLLocationManager 对象设置为一个属性,然后在委托方法中将委托设置为 nil 并分派一个块到主线程以释放该对象。

【讨论】:

    【解决方案2】:

    在从控制器返回之前(或至少在控制器的 dealloc 中),您是否将它的委托设置为 nil?我怀疑 CLLocationManager 正在尝试向已解除分配的委托发送消息 - 这就是它在 obj_msgSend 崩溃的原因。

    【讨论】:

    • & @ughoavgfhw:你们俩都绝对正确!我忘记将委托设置为零。我认为这不会成为问题,因为每次都必须有一个分配的视图控制器。所以非常感谢你的帮助!我现在将 viewWillDisappear 方法中的 GLLocationManager 设置为 nil,我希望应用程序不会再崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多