我遇到了一个崩溃,对我来说,好像这是一个苹果正在处理MKMapView的 goToDefaultLocation
消息的方式的错误 . 该消息依次调用 [ALCityManager localeWithCode:]
,调用 [NSLocale componentsFromLocaleIdentifier:]
,调用 CFLocaleCreateComponentsFromLocaleIdentifier
,调用 CFStringGetLength
并发生崩溃 .
有人可以帮我指出修复错误的方向,如果是我的代码导致这个,或者,帮助我找到一个解决方法,实际上,这是Apple的代码中的错误(不太可能?) .
崩溃日志如下:
Incident Identifier: 84198BB6-45BD-493B-955F-75CCB5246DDD
CrashReporter Key: 7dbf53bf1f1a3635d7c3c49e726dedc609ed9f3a
Hardware Model: iPhone3,1
Process: MyApp [340]
Path: /var/mobile/Applications/DCE9A5A1-8E24-4D4F-A1ED-9855C6CA1742/MyApp.app/MyApp
Identifier: MyApp
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2011-03-25 10:36:06.382 -0700
OS Version: iPhone OS 4.3 (8F190)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 CoreFoundation 0x00009a66 CFStringGetLength + 6
1 CoreFoundation 0x0002f994 CFLocaleCreateComponentsFromLocaleIdentifier + 60
2 CoreFoundation 0x000483b8 +[NSLocale componentsFromLocaleIdentifier:] + 12
3 AppSupport 0x00016eee -[ALCityManager localeWithCode:] + 130
4 MapKit 0x00038488 -[MKMapView goToDefaultLocation] + 80
5 Foundation 0x000907c6 __NSFireTimer + 130
6 CoreFoundation 0x00075a40 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
7 CoreFoundation 0x00077ec4 __CFRunLoopDoTimer + 844
8 CoreFoundation 0x0007883e __CFRunLoopRun + 1082
9 CoreFoundation 0x00008ebc CFRunLoopRunSpecific + 224
10 CoreFoundation 0x00008dc4 CFRunLoopRunInMode + 52
11 GraphicsServices 0x00004418 GSEventRunModal + 108
12 GraphicsServices 0x000044c4 GSEventRun + 56
13 UIKit 0x0002ed62 -[UIApplication _run] + 398
14 UIKit 0x0002c800 UIApplicationMain + 664
15 MyApp 0x000023f0 main (main.m:34)
16 MyApp 0x00002370 start + 44
2 回答
我得到了完全相同的崩溃报告,仅适用于iOS 4.3 / 4.3.1和iPhone 3GS / 4(armv7)
我认为这是一个Apple Bug,iOS4.3还有其他关于MapKit的丑陋回归 . (就像
MKReverseGeocoder
早期发布的崩溃......)一个简单的解决方法是覆盖
-[MKMapView goToDefaultLocation]
,但是由于它是一个私有API而面临苹果拒绝的风险......(拒绝了一个错误的解决方法......我知道......人们是卑鄙的)另一个解决方案是分析(反向...)CFLocaleCreateComponentsFromLocaleIdentifier和componentsFromLocaleIdentifier:以及
[ALCityManager localeWithCode:]
以了解它是如何崩溃的,使用nil
区域设置标识符调用并可能以编程方式修复应用程序区域设置,因为它看起来像是来自确定用户的区域设置的错误从设备设置(或更糟糕的是,来自城市/地理位置)...或至少WARN用户,其区域设置可能会导致麻烦...我不能(/想要)做的事情,无法重现该错误 .那你的异常代码是
EXC_BAD_ACCESS
. 这通常是内存管理错误(即一些代码试图访问已经释放/解除分配的对象) .这可能是但不太可能是Apple /框架代码中的错误 . 更有可能的是,代码中的某个位置要么过度释放某些内容,要么挂在自动发布的对象实例上,或者访问不应该访问的内容 .
鉴于崩溃发生在MapKit中,我发现在尝试访问LocationManager的情况下发生了崩溃,并且期望这样的情况失败(例如,通过返回
nil
位置),但不会使应用程序崩溃 .