2013-01-04 3 views
5

Возможно ли заставить Xcode complier проверить, что файлы, на которые ссылается код, действительны?Проверка времени компиляции для допустимых ссылок на файлы в Xcode

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

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

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

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

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

+0

Почему вы не используете конструкцию if-else для проверки доступности файла по заданному пути? –

+1

Не применимо. Если имя файла изменилось, я хочу знать об этом - я не хочу, и изображение должно быть загружено пустым. – bearMountain

+0

AFAIK theres ничего не дает, чтобы проверить это при компиляции. Более безопасным способом было бы использование констант. – Andy

ответ

3

AutoComplete for [UIImage imageNamed:] от Kent Sutherland.
Это обеспечивает поддержку завершения кода в Xcode - ярком фрагменте кода. Это работает для меня в Xcode 4.6: enter image description here

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

+0

Хороший инструмент, спасибо за обмен. – Till

1

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

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

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

3

Носки обычно имеют класс с тем же именем, что и файл, например.

[[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]. Нет способа проверить это во время компиляции.

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

+0

Отличное решение для скриптинга - я не думал об этом. Хотя в вашем первом пункте '[[MyViewController alloc] init]' фактически уже просматривает ваши файлы и загружает нить, если у него есть имя, соответствующее классу MyViewController (в соответствии с документами Apple). Это может сэкономить вам немного неприятностей. – bearMountain

+0

@bearMountain Я знаю об этом, возникла проблема с поиском по умолчанию при наследовании контроллеров с базового контроллера. Не помните точно причину, но я использую '[self class]' now. Не большая проблема :) – Sulthan

1

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

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

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