gpt4 book ai didi

iphone - CLLocationManger 向已分配实例发送消息

转载 作者:行者123 更新时间:2023-12-03 19:06:10 31 4
gpt4 key购买 nike

所以我有一个导航 Controller ,我在上面推一个 View Controller ,然后是第二个。在第二个中,我开始列出位置更新。好吧。

当我点击第二个 View Controller 上的后退按钮时,我有时收到“*** -[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”是开始监听位置更新的 View Controller 。在您做出回应之前,这里是 DistanceScreen 的释放:

NSLog(@"DistanceScreen dealloc");
[locationManager setDelegate:nil];
[locationManager stopUpdatingLocation];
[locationManager release];
//etc.
[super dealloc];

因此,如果我将委托(delegate)设置为 nil,为什么位置管理器看起来仍在尝试发送更新?或者是因为 CLLocationManager 正在自己的线程中执行操作,并在委托(delegate)被释放时启动位置更新过程???在这种情况下,没有简单安全的方法来停止监听更新。

最佳答案

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

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

关于iphone - CLLocationManger 向已分配实例发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381325/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com