iOS在CoreFoundation中的CFStringGetLength崩溃

fat*_*cat 6 iphone mapkit mkmapview ipad ios

我遇到了一个崩溃,对我而言,好像这是Apple处理goToDefaultLocationMKMapView消息的方式.该消息依次调用[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

Vin*_*rci 2

我得到了完全相同的崩溃报告,仅适用于 iOS 4.3 / 4.3.1 和 iPhone 3GS/4 (armv7)

我认为这是一个 Apple Bug,iOS4.3 还有其他关于 MapKit 的丑陋回归。(就像MKReverseGeocoder早期发布的崩溃一样......)

  1. 一个简单的解决方法是覆盖,-[MKMapView goToDefaultLocation]但有被 Apple 拒绝的风险,因为它是一个私有 API... (因 bug 解决方法而被拒绝...我知道...人们很刻薄)

  2. 另一种解决方案是分析(反向...) CFLocaleCreateComponentsFromLocaleIdentifiercomponentsFromLocaleIdentifier:了解[ALCityManager localeWithCode:]它如何崩溃,使用nil区域设置标识符进行调用,并可能以编程方式修复应用程序区域设置,因为它看起来像是来自从设备设置(或更糟糕的是,来自城市/地理位置)...或者至少警告用户其区域设置可能会引起麻烦...我只是不能(/想要)做一些事情,无法重现该错误。