CLLocationManger отправляет сообщение выделенному экземпляру - PullRequest
4 голосов
/ 07 декабря 2010

Итак, у меня есть навигационный контроллер, я нажимаю на него контроллер представления, затем секунду. Во втором я начинаю перечислять для обновления местоположения. Хорошо, хорошо.

Когда я нажимаю кнопку "Назад" на втором контроллере вида, я иногда получаю "*** -[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:

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

Так что, если я устанавливаю делегата равным nil, почему, похоже, Location Manager все еще пытается отправить обновление? Или это потому, что CLLocationManager делает вещи в своем собственном потоке и запускает процесс обновления местоположения так же, как делегат был освобожден? В этом случае нет простого безопасного способа прекратить прослушивание обновлений.

Ответы [ 2 ]

7 голосов
/ 25 апреля 2012

У меня была такая же проблема при тестировании моего приложения на 4.3, но не в 5.0. Проблема заключалась в том, что я пытался освободить CLLocationManager внутри одного из методов делегата. Он отлично работает в 5.0, но каждый раз вылетает iPhone 3GS под управлением 4.3.

В конце я сделал объект CLLocationManager свойством, затем в методе делегата установил делегат равным nil и отправил блок в главный поток для освобождения объекта.

3 голосов
/ 04 августа 2012

Я столкнулся с той же проблемой, и этот пост помог мне https://stackoverflow.com/a/5214608/1210822

, добавив self.locationManager.delegate = nil; в dealloc. Авария, похоже, исправлена.

Надеюсь, это поможет!

...