Проверка времени компиляции для допустимых ссылок файла в XCode

Можно ли заставить компилятор Xcode проверить, что файлы, на которые есть ссылки в коде, действительны?

Есть несколько моментов в разработке Какао, когда вы естественным образом ссылаетесь на файл программно через NSString:

[UINib nibWithNibName:@"MyNib" bundle:nil];
[UIImage imageNamed:@"MyImage"];
[[UIViewController alloc] initWithNibName:@"MyNib" bundle:nil];

Есть ли способ во время компиляции проверить, являются ли эти ссылки на файлы действительными?

Часто после использования вышеуказанных методов я заканчиваю тем, что меняю имя ссылочного файла, но забываю изменить имя в коде. Все выполняется без проблем, и только когда вы попадете в ту часть приложения, которая обращается к этому файлу, ошибка обнаружит себя.

Есть ли другой подход или техника, которую люди используют, чтобы избежать такого рода ошибок?
Ссылка на имя файла через строку кажется очень хрупкой.

4 ответа

Решение

Автозаполнение для[UIImage imageNamed:] Кент Сазерленд.
Это обеспечивает поддержку автозавершения кода в XCode - блестящий кусок кода. Это работает для меня в Xcode 4.6:

В настоящее время этот проект не поддерживает другие строки, кроме imageNamed:, Чтобы поддержать их, я постараюсь написать скрипт времени компиляции. Или, может быть, я стану смелым и попытаюсь продлить впечатляющую работу мистера Сазерленда.

У перьев обычно есть класс с тем же именем, что и у файла, например

[[MyViewController alloc] initWithNibName:NSStringFromClassName([MyViewController class]) bundle:nil];

Я обычно прячу это в контроллер init метод как [self class],

Для загрузки изображения проверки во время компиляции трудны. Помогите себе с макросами, сначала замените метод загрузки на простой макрос, например

#define LOAD_IMAGE(__IMAGE_NAME__) [UIImage imageNamed:__IMAGE_NAME__]

Первое, что вы должны сделать, это положить assert в этот макрос и всегда проверяйте, что изображение было успешно загружено. Это не проверка во время компиляции, но она помогает найти недостающие ресурсы.

Второе - написать скрипт ruby ​​/python/shell/(любой язык сценариев), который будет искать ваши исходные файлы LOAD_IMAGE и проверьте, существует ли файл (в скобках). Как сценарий оболочки, это будет очень просто (например, используя grep). Вы можете добавить этот скрипт в ваш проект xcode для запуска при компиляции. Не забудьте проверить изображения, на которые ссылается xibs.

Однако часто вам приходится динамически создавать имя изображения, например, NSString* imageName = [NSString stringWithFormat:@"image_%i", index], Там нет никакого способа, как вы можете проверить это во время компиляции.

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

Вот скрипт bash, который мы используем, который перечисляет все изображения на диске, но НЕ упоминается в коде. https://gist.github.com/3750087

Вероятно, было бы легко изменить это, чтобы проверить наличие изображений и XIB. В любом случае, сценарий должен быть хорошей отправной точкой

XCode не поддерживает это, но если эта проблема действительно кусает вас, то вы можете использовать следующий хак:

  • Дайте каждому входящему в комплект файлу уникальный префикс (например, app__)
  • Когда вы добавляете файл в свой проект, убедитесь, что вы сначала переименовали его, чтобы добавить этот префикс.
  • Ваша проверка времени компиляции (предварительного распространения) состоит из двух частей: 1) Поиск во всех файлах.m и перечисление строк, начинающихся с префикса. Вам не нужно проверять, заключена ли строка в кавычки, поскольку ваш префикс уникален. 2) grep project.pbxproj для каждой строки, чтобы проверить, включена ли она в комплект.

С некоторыми усилиями этот процесс может быть в основном автоматизирован, а также оптимизирован, но приведенный выше рецепт должен работать.

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