2016-02-14 2 views
-3

Может и как можно спросить об этом вопросе и каковы конкретные рекомендации?В чем разница между #import "" в файлах .h и .m?

+0

Вопрос не ясен. Вы спрашиваете разницу между использованием '@ class' и' # import' в файле заголовка? – trojanfoe

+0

Не только, можете ли вы подробнее объяснить? –

+0

У вас уже есть ответ, который выглядит довольно полным. – trojanfoe

ответ

1

The (может быть упрощенная) версия выглядит следующим образом:

Если импортировать файл заголовок/интерфейс, это как в том числе и весь другой файл в этом месте. Таким образом, как правило, весь ваш код интерфейса известен в этом месте. Когда вы работаете с некоторыми классами/объектами, компилятор должен знать, что они собой представляют и как они называются точно: какие аргументы/параметры нужны методам, что возвращают методы? Чтобы ответить на эти вопросы, заголовочные файлы обычно включаются в файл immentmentation (.m).

Поскольку реализация импортирует собственный заголовочный файл, вы можете часто помещать туда другие импортеры. Но когда вам нужен импорт в файле заголовка? Когда вы объявляете свой интерфейс, вы часто упоминаете другие типы/классы, то есть вы говорите @proerty (strong) SomeClass *element;. Теперь компилятор должен знать что-то о SomeClass, но не все. Если компилятор знает, что это другой класс, все будет нормально на на этот раз. В файле заголовка больше информации не требуется, поэтому может быть достаточно «прямого объявления» @class SomeClass. Импортирует полный файл заголовка для вашего другого класса.

Итак, где недостаток импорта? В основном есть два аргумента: время цикла компиляции и импорт. Рассмотрим небольшой пример - всякий раз, когда изменяется SomeClass.h, все, что включает его, также необходимо перекомпилировать. Это легко каскадирует через полный код. Кроме того, очевидно, что любой код, который импортирует ваш файл заголовка, импортирует все их импорт и т. Д. Аргументы работают так. A.h импортирует B.h, B.h импортирует A.h. В зависимости от того, что в них, нужно знать перед другим ...

(Я хотел бы упомянуть, что проблемы немного более расслаблены с использованием последних компиляторов, но основная аргументация по-прежнему сохраняется).

Некоторые более Примечания: @class вперед заявление может быть необходимо, когда вы объявляете два типа, которые связаны друг с другом, то есть протокол, который использует определенный класс, который Вы заявляете чуть ниже:

@class SomeClass; 

@protocol SomeProtocol 
-(void)doSomethingWith:(SomeClass *)object; 
@end; 

@interface SomeClass 
@end 

Переслать объявление Безразлично 't работать для протоколов, реализуемых классом или родительских классов.

+0

Большое спасибо за ваш ответ! и можете ли вы говорить о большей разнице между компиляцией и запуском в этом вопросе? –

+0

Это все об источнике и компиляции. Это никак не повлияет на запущенную программу. – Eiko

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