@class против #import в экономии времени компиляции заголовка с помощью Clang?

Я читал в нескольких местах, что рекомендуется использовать объявления, такие как @class Something, в файлах заголовков и импортировать эти классы только в файл .m, чтобы сэкономить время компиляции.

Действительно ли это все еще необходимо и ускоряет компиляцию с помощью LLVM Clang, или преимущество времени компиляции действительно только для более старых компиляторов, таких как (старые версии) GCC?


person Raphael    schedule 01.09.2011    source источник


Ответы (2)


@Eimantas прав насчет круговых зависимостей. Это также для производительности. Представьте себе случай, когда вы импортируете A.h в B.h и B.h в C.m. Теперь каждый раз, когда вы изменяете A.h, C.m перекомпилируется, хотя C.m может ни на что не полагаться в A.h. Использование @class позволяет избежать такого оттока сборки. Переход к clang ничего не меняет.

Обратите внимание, что это относится только к заголовкам, которые вы можете изменить. Обычно это нормально и предпочтительнее импортировать системные заголовки непосредственно в ваши .h файлы.

person Rob Napier    schedule 01.09.2011

Случайно вы можете получить циклический импорт:

// A.h
#import "B.h"

// B.h
#import "A.h"

Препроцессор будет включать B.h в A.h, которые, в свою очередь, включают A.h (потому что B.h импортирует его), которые, в свою очередь, снова импортируют B.h и т. д. до бесконечности.

Операторы @class предотвращают эту случайную ошибку, поскольку ошибка, вызванная циклическим импортом, действительно ДЕЙСТВИТЕЛЬНО неинтуитивна (говоря из личного опыта и проверок трассировки/ошибок).

person Eimantas    schedule 01.09.2011