Как удалить сотни предупреждений "неявное преобразование теряет целочисленную точность:" 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.

Теперь я знаю, как обращаться с ними вручную, но это огромная задача и очень трудоемкая. Я также знаю, что могу замолчать все предупреждения о несоответствии типов, но я не хочу этого делать. Конечно, они очень полезны.

Что я пробовал:

  1. Я преобразовал [NSNumber numberWithInt:abc]; в [NSNumber numberWithInt:(int)abc]; используя find-n-replace. Это исправило некоторые.
  2. Я также пытался изменить все свои свойства int на свойства NSInteger, но это удвоило количество предупреждений (достигло 900+). Так что я вернулся.

  3. Я также пытался найти регулярное выражение, но не смог найти что-то подходящее для моих нужд.

Вопрос:

Я ищу регулярное выражение или любой другой обходной путь, который кто-то пробовал, который может уменьшить объем работы, необходимой для их исправления вручную.

Заранее спасибо.

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 для длинного целого числа. Для лучшего понимания прочитал эту яблочную документацию.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Cocoa64BitGuide/ConvertingExistingApp/ConvertingExistingApp.html

Неявное преобразование target c теряет целочисленную точность "NSUInteger" (иначе "unsigned long") в "int"

Изменить ключ в Project > Build Setting "неявное преобразование в 32-битный тип> Debug > *64 архитектура: нет"

Другое предупреждение

Изменить ключ в Project > Build Setting "typecheck вызывает printf/scanf: НЕТ"

Пояснение: [Как это работает]

Проверьте вызовы printf, scanf и т. Д., Чтобы убедиться, что в предоставленных аргументах есть типы, соответствующие указанной строке формата, и что преобразования, указанные в строке формата, имеют смысл.

Надеюсь это сработает

[предостережение: это может аннулировать другое предупреждение о преобразовании 64-битной архитектуры].

Другие вопросы по тегам