Сбой iOS в CFStringGetLength в CoreFoundation - PullRequest
6 голосов
/ 13 апреля 2011

Я получаю сбой, который, на мой взгляд, является ошибкой в ​​том, как Apple обрабатывает сообщение goToDefaultLocation MKMapView.Это сообщение, в свою очередь, вызывает [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 ]

2 голосов
/ 14 апреля 2011

Я получил точно такие же отчеты о сбоях, ТОЛЬКО с iOS 4.3 / 4.3.1 И iPhone 3GS / 4 (armv7)

Я думаю, что это ошибка Apple, iOS4.3 имеет другие уродливые регрессии относительно MapKit. (например, MKReverseGeocoder ранний выпуск сбоя ...)

  1. Простой обходной путь - переопределить -[MKMapView goToDefaultLocation], но рискует быть отвергнутым Apple, поскольку это закрытый API ... (Отклонено из-за ошибки ... Я знаю ... Люди подлые)

  2. Другим решением было бы проанализировать (обратный ...) CFLocaleCreateComponentsFromLocaleIdentifier и componentsFromLocaleIdentifier: и [ALCityManager localeWithCode:], чтобы понять, как он может произойти сбой при вызове с идентификатором nil и, возможно, программно исправить языковой стандарт приложения, поскольку похоже на ошибку, возникающую при определении языкового стандарта пользователя из настроек устройства (или, что еще хуже, из города / геолокации) ... или, по крайней мере, ПРЕДУПРЕЖДЕНИЕ. Пользователь, что его настройки языка могут вызвать проблемы ... Что-то, что я просто не могу (/ хочу) сделать, не имея возможности воспроизвести эту ошибку.

1 голос
/ 13 апреля 2011

Ну, ваш код исключения EXC_BAD_ACCESS. Обычно это ошибка управления памятью (т. Е. Некоторый фрагмент кода пытался получить доступ к объекту, который уже был освобожден / освобожден).

Возможно, но очень маловероятно, что это ошибка в коде Apple / framework. Скорее всего, где-то в вашем коде вы либо чрезмерно освобождаете что-то, либо зависаете в автоматически выпущенном экземпляре объекта, либо иным образом получаете доступ к чему-то, к чему не следует обращаться.

Учитывая, что сбой произошел в MapKit, я бы порекомендовал взглянуть на код, связанный с вашей картой, на возможные источники этого сбоя. Обратите внимание, что MapKit может быть немного вспыльчивым; Я видел сбои в таких случаях, как попытка получить доступ к текущему местоположению LocationManager, когда у пользователя отключены службы определения местоположения. Я ожидал бы, что такой случай потерпит неудачу (например, путем возврата местоположения nil), но не приведет к сбою приложения.

...