所以我有一个导航控制器,我按下一个视图控制器,然后是一秒钟。在第二个我开始列出位置更新。好的。
当我点击第二个视图控制器上的后退按钮时,我有时获取"*** -[DistanceScreen respondsToSelector:]: message sent to deallocated instance 0x1152a0"
注意在实际设备上进行测试(iPhone 4,4.2 iOS)。
堆栈看起来像:
#0 0x33a69910 in ___forwarding___
#1 0x33a69860 in __forwarding_prep_0___
#2 0x343713fa in -[CLLocationManager onClientEventLocation:]
#3 0x3436f694 in -[CLLocationManager onClientEvent:supportInfo:]
#4 0x3436f80a in OnClientEvent
#5 0x3436b528 in CLClientInvokeCallback
#6 0x3436d3d2 in CLClientHandleDaemonDataLocation
#7 0x3436d518 in CLClientHandleDaemonData
#8 0x33a81404 in __CFMessagePortPerform
#9 0x33a556fe in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
#10 0x33a556c2 in __CFRunLoopDoSource1
#11 0x33a47f7c in __CFRunLoopRun
#12 0x33a47c86 in CFRunLoopRunSpecific
#13 0x33a47b8e in CFRunLoopRunInMode
#14 0x33b0e4aa in GSEventRunModal
#15 0x33b0e556 in GSEventRun
#16 0x32099328 in -[UIApplication _run]
#17 0x32096e92 in UIApplicationMain
#18 0x0000280e in main at main.m:13
上面的“DistanceScreen”是开始侦听位置更新的视图控制器。在你回应之前,这是DistanceScreen的dealloc:
NSLog(@"DistanceScreen dealloc");
[locationManager setDelegate:nil];
[locationManager stopUpdatingLocation];
[locationManager release];
//etc.
[super dealloc];
因此,如果我将委托设置为nil,为什么它看起来像位置管理器仍在尝试发送更新?或者是因为CLLocationManager正在自己的线程中执行操作,并且在委托被解除分配时启动了位置更新过程????在这种情况下,没有简单的安全方法来停止收听更新。
答案 0 :(得分:7)
我在4.3上测试我的应用程序时遇到同样的问题,但不是5.0。问题是我试图在其中一个委托方法中释放CLLocationManager。它在5.0中运行良好,但每次都会运行一次运行4.3的iPhone 3GS。
最后我将CLLocationManager对象作为属性,然后在委托方法中将委托设置为nil并将一个块分派给主线程以释放该对象。
答案 1 :(得分:3)
我遇到了同样的问题,这篇文章帮助了我https://stackoverflow.com/a/5214608/1210822
在dealloc中添加self.locationManager.delegate = nil;
。崩溃似乎是固定的。
希望它有所帮助!