iOS在CoreFoundation中的CFStringGetLength崩溃

时间:2011-04-13 00:20:20

标签: iphone ios ipad mapkit mkmapview

我遇到了一个崩溃,对我来说,好像这是Apple处理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 个答案:

答案 0 :(得分:2)

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

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

  1. 一个简单的解决方法是覆盖-[MKMapView goToDefaultLocation],但由于它是私有API而面临Apple拒绝的风险... (因错误解决方法而被拒绝...我知道。 ..人是卑鄙的)

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

答案 1 :(得分:1)

你的异常代码是EXC_BAD_ACCESS。这通常是内存管理错误(即,一些代码试图访问已经释放/解除分配的对象)。

这可能但不太可能是Apple /框架代码中的错误。你的代码中的某个地方更有可能是过度释放某些内容或者挂在自动发布的对象实例上,或者访问不应该访问的内容。

鉴于崩溃发生在MapKit中,我建议您查看与地图相关的代码,以了解此崩溃的可能来源。请注意,MapKit可能有点温和;我见过崩溃,例如当用户关闭位置服务时尝试访问LocationManager的当前位置。我希望这种情况会失败(例如,通过返回nil位置),但不会使应用程序崩溃。