2013-07-02 2 views
1

xcode 4.6 (4H127), xcode 4.6.3 (4H1503): Простая конвертация в нижнем/верхнем регистре строки с ударным символом вызывает зависание в зависимости от настройки цели развертывания. Фрагмент кода:Преобразование NSString в нижние регистры

NSString *lc1 = @"Bosnië-Herzegovina"; 
NSString *lc2 = [lc1 lowercaseString]; 
NSString *uc3 = [lc1 uppercaseString]; 
NSLog(@"\nlc1=%@\nlc2=%@\nuc3=%@ ", lc1,lc2,uc3); 

«Е» просто набирается как «неавтоматического и £», файл исходного кода регулярно UTF Unicode.

lc1 выглядит как ожидается в отладчике. Но в строках lc2 и uc3 есть «китайские» символы, добавленные в конце, с целью развертывания < 6.1. С выбранным 6.1 китайские символы исчезли. Все, что может быть просто совместимостью UTF отладчика, но с целью развертывания 5.0-5.1, фрагмент кода падает даже, как показано ниже, и это моя проблема; строки в моем фактическом приложении не находятся в исходном коде, а из базы данных SQLite. Итак, на данный момент я могу создать только свое приложение для цели развертывания 6.0+? Я что-то упускаю?

0x1c49a20: incl %eax 
0x1c49a21: jmp 0x1c499fb     ; CFUniCharMapCaseTo + 1275 
0x1c49a23: movl 12(%ebp), %eax 
0x1c49a26: movw $105, (%eax) 
0x1c49a2b: movw $775, 2(%eax) 
0x1c49a31: movl $2, %eax 
0x1c49a36: jmp 0x1c49dac     ; CFUniCharMapCaseTo + 2220 
0x1c49a3b: movl 12(%ebp), %eax 
0x1c49a3e: movw $105, (%eax) 
0x1c49a43: movw $775, 2(%eax) 
0x1c49a49: movw $771, 4(%eax) 
0x1c49a4f: movl $3, %eax 
0x1c49a54: jmp 0x1c49dac     ; CFUniCharMapCaseTo + 2220 
0x1c49a59: movl %eax, %edi 
0x1c49a5b: movl 1264482(%edi), %eax 
0x1c49a61: movl (%eax), %eax 
0x1c49a63: movl %eax, (%esp) 
0x1c49a66: movl $0, 8(%esp) 
0x1c49a6e: movl $48, 4(%esp) 
0x1c49a76: calll 0x1bd9980     ; CFAllocatorAllocate 
0x1c49a7b: leal 16(%eax), %ecx 
0x1c49a7e: movl %ecx, 1379418(%edi) 
0x1c49a84: leal 32(%eax), %ecx 
0x1c49a87: movl %ecx, 1379422(%edi) 
0x1c49a8d: movl 1379410(%edi), %ecx 
0x1c49a93: movl (%ecx), %ecx <-- EXC_BAD_ACCESS (code=1,.. 
0x1c49a95: movl (%ecx), %ecx 

Edit: Я пытался минимизировать проект, чтобы показать эту проблему, и ... он исчез. У меня есть немного C-кода старого стиля, который использует такие вещи, как malloc, free, freed, memmove и т. Д. Если этот бит просто присутствует, даже не вызван, описанные проблемы происходят. Теперь я предполагаю, что некоторые подпрограммы загружаются из библиотеки, из которой она не должна загружаться. Копаем дальше.

+0

Неужели это все еще сбой, если вы выберете «? – Skyler

+0

Я не могу воспроизвести проблему с вашим кодом. Если целевой настройкой развертывания установлено значение 5.0 и запущено в iOS 5 Simulator, я получаю ожидаемый результат и без сбоев. - Возможно, проблема заключается в том, где вы читаете SQLite и конвертируете в NSString. Можете ли вы показать этот код? –

+0

Спасибо! Какую версию xcode вы используете? – RickJansen

ответ

0

Ну, я подозреваю, что возникла проблема с загрузкой из библиотек или порядок загрузки заставил меня изменить порядок включенных фреймворков: в разделе «Сборка фаз» я заметил «CoreText.framework» как один из последних записей. Я переместил его на первое место, и теперь все работает отлично для всех целей развертывания, 5.0, 5.1, 6.0, 6.1

Я действительно посмотрел на загрузочную карту, которую вы можете создать, установив LD_GENERATE_MAP_FILE в да, безрезультатно.

Другой указатель был предоставлен путем редактирования «Схемы» и включения «Загрузка журнальной библиотеки» и «Использование API журналов», в котором вы можете видеть, что материал загружается из разных библиотек, один из них: CoreText.framework

В конце концов перемещение CoreText.framework в начало списка заставило все это работать.

«Китайские» символы, которые вы все еще можете увидеть в отладчике при использовании цели развертывания 5.0-6.0. С 6.1 даже они исчезли. Наверное, они это исправили.

0

Без ответа на ваш вопрос, но попытка ответить, как никто другой, казалось бы, нет никаких «верхних» ассоциаций случаев с этими иностранными символами.

Можете ли вы запустить регулярное выражение или заменить какую-либо строку, чтобы изменить все известные специальные символы с нормализованной (английской) версией? Тогда они будут иметь прописные или строчные преобразования.

Конечно, это может полностью испортить строки, которые вы читали из БД, если они не написаны правильно.

+1

'lowercaseString' и' uppercaseString' работают со всеми символами. Если нет версии с верхним/нижним регистром, символ остается неизменным. –

+0

Из сборочного свалка кажется, что он пытается, по очереди, работать с однимихарами. Это код, который всегда работает нормально, но новый Xcode и т. Д. – RickJansen

+0

О, я вижу, спасибо за информацию! – jrafferty

Смежные вопросы