我遇到了一个崩溃,对我来说,好像这是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
答案 0 :(得分:2)
我得到完全相同的崩溃报告,仅适用于iOS 4.3 / 4.3.1和iPhone 3GS / 4(armv7)
我认为这是一个Apple Bug,iOS4.3还有其他关于MapKit的丑陋回归。 (就像MKReverseGeocoder
早期发布的崩溃......)
一个简单的解决方法是覆盖-[MKMapView goToDefaultLocation]
,但由于它是私有API而面临Apple拒绝的风险... (因错误解决方法而被拒绝...我知道。 ..人是卑鄙的)
另一个解决方案是分析(反向...) CFLocaleCreateComponentsFromLocaleIdentifier
和componentsFromLocaleIdentifier:
以及[ALCityManager localeWithCode:]
以了解它是如何崩溃的使用nil
区域设置标识符调用并且可能以编程方式修复应用程序区域设置,因为它看起来像是从设备设置(或者更糟,来自城市/地理位置)确定用户的区域设置的错误...或者至少是WARN用户区域设置可能会导致麻烦......
我不能(/想要)做的事情,无法重现那个bug。
答案 1 :(得分:1)
你的异常代码是EXC_BAD_ACCESS
。这通常是内存管理错误(即,一些代码试图访问已经释放/解除分配的对象)。
这可能但不太可能是Apple /框架代码中的错误。你的代码中的某个地方更有可能是过度释放某些内容或者挂在自动发布的对象实例上,或者访问不应该访问的内容。
鉴于崩溃发生在MapKit中,我建议您查看与地图相关的代码,以了解此崩溃的可能来源。请注意,MapKit可能有点温和;我见过崩溃,例如当用户关闭位置服务时尝试访问LocationManager的当前位置。我希望这种情况会失败(例如,通过返回nil
位置),但不会使应用程序崩溃。