Проверка времени компиляции для допустимых ссылок файла в 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 для каждой строки, чтобы проверить, включена ли она в комплект.
С некоторыми усилиями этот процесс может быть в основном автоматизирован, а также оптимизирован, но приведенный выше рецепт должен работать.