2011-03-06 7 views
2

내 crashlog를 분석하는 데 문제가 있습니다. 앱을 시작하기 위해 앱 아이콘을 클릭 할 때 iPhone이 가끔 충돌합니다. 앱이 백그라운드에서 이미 실행되고 있지만 활성화되어 있지 않습니다. 이것은 상징화 된 충돌 로그입니다.Core Location 콜백 기계에 iOS 앱이 충돌합니다.

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에서 오류가 발생했습니다.

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

나에게 어떻게 오류를 찾을 수있는 힌트를주십시오 : 선 (14)는 기본 코드의 일부입니다.
미리 감사드립니다.

+0

'CLLocationManager'의 일부 코드가 충돌하는 것 같습니다. 앱에서 위치 추적을 사용합니까? –

+0

안녕하세요, 올레! 예, 위치 추적을 사용합니다. didFinishLaunchingWithOptions 메서드에서 시작하는 AppDelegate에 CLLocationManager가 있습니다. 위치를 필요로하는 뷰 컨트롤러가 사용될 때마다 적절한 didUpdateToLocation 메서드를 사용하기 위해 뷰 컨트롤러를 CLLocationManager의 대리자로 설정합니다. 이거 괜찮아? 감사! – sqeez3r

+0

배경을 입력 할 때 델리게이트를 nil로 설정합니까? 그렇지 않으면 델리게이트로 설정된 뷰 컨트롤러가 할당 해제되어 충돌을 일으킬 수 있습니다. 또한 오류 로그의 맨 위를보고 발생한 위치를 확인해야합니다. 크래쉬가 쓰레드 0에 있다면, main 함수는 항상 백 트레이스의 맨 아래에있을 것이다. – ughoavgfhw

답변

4

컨트롤러에서 (또는 적어도 컨트롤러의 dealloc) 리턴하기 전에 nil으로 위임하도록 설정 했습니까? 나는 CLLocationManager가 이미 할당 취소 된 델리게이트에게 메시지를 보내려고하고 있다고 의심합니다 - 그것이 obj_msgSend에서 충돌하는 이유입니다.

+0

& @ughoavgfhw : 둘 다 절대적으로 맞습니다! 델리게이트를 0으로 설정하는 것을 잊어 버린다. 매번 할당 된 뷰 컨트롤러가 있어야하기 때문에 이것이 문제가되지 않을 것이라고 생각했습니다. 도와 주셔서 대단히 감사합니다! 이제 viewWillDisappear 메서드의 GLLocationManager를 nil로 설정하고 응용 프로그램이 더 이상 충돌하지 않기를 바랍니다. – sqeez3r

0

4.3에서는 내 앱을 테스트했지만 5.0에서는 테스트하지 않는 것과 동일한 문제가있었습니다. 문제는 대리자 메서드 중 하나에서 CLLocationManager를 dealloc하려고 시도했기 때문입니다. 5.0에서는 문제없이 작동하지만 매번 실행되는 iPhone 3GS는 다운됩니다.

결국 CLLocationManager 개체를 속성으로 만들고 대리자 메서드에서 대리자를 nil로 설정하고 개체를 릴리스하기 위해 주 스레드에 블록을 전달했습니다.

관련 문제