Вы помещаете #import s в файлы.h или.m?

Интересно о стиле Objective-C.

У меня есть FooClass.[Hm], который зависит от BarClass.[Hm] для его реализации (хотя не для его интерфейса). Я могу #import "BarClass.h" или непосредственно в FooClass.m или косвенно через FooClass.h. Интересно насчет общего выбора для этого.

1 ответ

Решение

Вы должны ВСЕГДА #import другие классы в вашем .m файл.

Если они также являются членами вашего класса, вы можете объявить их (используя @class директива) в вашем .h файл.

Причина в том, что когда вы #import .h файл, вы хотите импортировать только объявления, а не определения. Используя @class и только #importв .m файлы, вы: а) сокращение накладных расходов и б) делает для чистого кода.

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

Причина, лежащая в основе предварительных объявлений в заголовочных файлах, заключается в том, что они избегают ненужных зависимостей. т.е. представьте, что Bh вперед объявляет об импорте A и Bm. А затем представьте, что Cm, Dm, Em и Fm импортируют Bh. После того, как все это будет сделано, Ah изменится. Так как A объявлен только вперед в Bh, только Bm необходимо перестроить. Без предварительных деклараций Cm, Dm, Em и Fm должны были бы быть перестроены, если A изменится

Пример:

.hфайл:

@class BarClass;

@interface FooClass : NSObject

...

@end

.mфайл

#import "BarClass.h"

@implementation FooClass

...

@end
  • .h файл - общедоступный interface класса
  • .m файл - частный implementation класса

Мои правила:

  • Предварительная декларация [О компании] -@class внутри .h файл
  • Вам следует сократить импорт в .h
  • Акцент должен быть на импорте в .m файл, который предотвращает проблемы с зависимостями

Когда тебе что-то нужно в implementation тогда вы должны импортировать его в .m. Когда тебе что-то нужно вinterface тогда вы должны импортировать его в .h.

Подробнее об импортных угловых скобках<> и кавычки ""

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