Как удалить сотни предупреждений "неявное преобразование теряет целочисленную точность:" NSInteger "(он же" long ") в" int "", которое я получил после обновления до arm64?
Проблема:
Вчера я конвертировал большой проект для поддержки arm64, и после этого я получил сразу более 500 предупреждений. Около 70% из них где NSInteger
присваивается int или наоборот, а остальные места, где NSUInteger отформатирован в NSString
как это:
NSInteger a = 123;
NSString *str = [NSString stringWithFormat:@"Int:%d", a]; //warning: value of 'NSInteger' should not be used as formate argument; add an explicit cast to 'unsigned long' instead.
Теперь я знаю, как обращаться с ними вручную, но это огромная задача и очень трудоемкая. Я также знаю, что могу замолчать все предупреждения о несоответствии типов, но я не хочу этого делать. Конечно, они очень полезны.
Что я пробовал:
- Я преобразовал
[NSNumber numberWithInt:abc];
в[NSNumber numberWithInt:(int)abc];
используя find-n-replace. Это исправило некоторые. Я также пытался изменить все свои свойства int на свойства NSInteger, но это удвоило количество предупреждений (достигло 900+). Так что я вернулся.
Я также пытался найти регулярное выражение, но не смог найти что-то подходящее для моих нужд.
Вопрос:
Я ищу регулярное выражение или любой другой обходной путь, который кто-то пробовал, который может уменьшить объем работы, необходимой для их исправления вручную.
Заранее спасибо.
3 ответа
В случае, если кто-то еще сталкивается с подобной ситуацией, я хочу уточнить, как с этим справиться. Хотя ответ @ Раджу предлагает сделать это вручную (чего я хотел избежать), я нашел именно то, что мне было нужно, по ссылке, которой он поделился.
Apple предоставила скрипт для 64-битного преобразования под названием ConvertCocoa64
, расположен в/Developer/Extras/64BitConversion/ConvertCocoa64
который не только конвертирует все int в NSInteger, он также имеет дело с преобразованием с плавающей точкой в CGFloat, как указано:
Он преобразует большинство экземпляров int и unsigned int в NSInteger и NSUInteger соответственно. Он не конвертирует целые числа в объявлениях битовых полей и других неуместных случаях. Во время обработки скрипт ссылается на жестко закодированный список исключений.
В дополнение к приведенным выше преобразованиям он также помечает строки в коде, которые необходимо исправить вручную. Так что это может помочь с предупреждениями о форматах строк.
Пожалуйста, обратитесь к этой ссылке для получения полной информации. Он не только объясняет, как использовать скрипт, но также предлагает некоторые очень важные контрольные точки после 64-битной миграции.
NSInteger a = 123;
NSString *str = [NSString stringWithFormat:@"Int:%ld", (long)a];
После обновления до 64 бит нужно сделать typecast вот так ((долго) а). %d только для 32-битного диапазона%ld для длинного целого числа. Для лучшего понимания прочитал эту яблочную документацию.
Неявное преобразование target c теряет целочисленную точность "NSUInteger" (иначе "unsigned long") в "int"
Изменить ключ в Project > Build Setting "неявное преобразование в 32-битный тип> Debug > *64 архитектура: нет"
Другое предупреждение
Изменить ключ в Project > Build Setting "typecheck вызывает printf/scanf: НЕТ"
Пояснение: [Как это работает]
Проверьте вызовы printf, scanf и т. Д., Чтобы убедиться, что в предоставленных аргументах есть типы, соответствующие указанной строке формата, и что преобразования, указанные в строке формата, имеют смысл.
Надеюсь это сработает
[предостережение: это может аннулировать другое предупреждение о преобразовании 64-битной архитектуры].