2015-11-09 6 views
0

У меня есть следующая структура проекта:Вложенные операторы #import: как скрыть вложенные?

  • main.h
    • Son1.h
    • Son2.h

Они не связаны между собой (не отец/сын отношения), всего два импорта, как в Main.h У меня есть:

#import Son1.h 
#import Son2.h 

Если из другого файла я пишу

#import Main.h 

я буду видеть, все методы/свойства Main.h (и это нормально), но я также вижу методы Son1.h и Son2.h.

Как я могу предотвратить это?

+2

Импорт в .m? И если нужно, делайте '@class Son1;' и '@class Son2;', если у вас есть какое-то объявление с 'Son1' или' Son2'. Обратите внимание, что '# import' не имеет"; ". – Larme

+1

Если вы не хотите, чтобы они включались при включении Main.h, не помещайте их в Main.h. В общем, вы должны учитывать, что какие-либо включения/импорта в заголовок должны быть частью этого заголовка, потому что это то, что увидит компилятор. Если вы хотите, чтобы определенные файлы включались только при определенных условиях, не включайте их в заголовок «зонтик», который включает все. –

+0

проблема заключается в том, что мне нужно «# import» в «зонтике», так как Main выполняет некоторую работу с ними. Как я могу обрабатывать '# import' в .m с' @ class' в 'Main.h', используя также делегаты (которые из импортированных файлов) – zerbfra

ответ

0

Важно понимать, что такое #import (и версия C: #include).

Компиляция программ C концептуально есть 3 шага:

  • Preprocessing
  • Компиляция
  • Связывание

В директивах, начиная с # которые действовали на препроцессором (это не независимо от того, является ли это отдельной бинарной или частью компилятора). Оба этих утверждения приводят к тому, что содержимое именованного файла будет вставлено в файл импорта (или включая) в том месте, где найдена директива. Это совершенно язык-агностик. В импортированном файле может быть что угодно. Вы можете импортировать JPG, если хотите (но удача компиляции!).

В вашем примере, за счет импорта Son1.h и Son2.h в Main.h, вы создаете, с точки зрения компилятора, один файл с содержимым Son1.h с последующим содержанием Son2.h следуют все, что в Main.h сам. На этом уровне идея скрытия контента не имеет смысла. Вы явно попросили препроцессор разместить это содержимое там. Он ничего не знает о тексте, который он вставляет, поэтому он не может следовать какой-либо директиве Objective-C, даже если таковой существует.

Комментарии попадают в другой пункт. Импорт в .h должен быть сведен к абсолютному минимуму. Наиболее распространенными причинами для импорта являются определения типов классов и протоколов, а Objective-C позволяет вам заранее объявить обоим из них, чтобы избежать ненужных импортных импортных операций.

Если у вас есть что-то вроде:

@interface MyClass : NSObject 
    @property(nonatomic, strong) MyOtherClass *myOtherClass; 
@end 

Вы обычно должны были бы #import "MyOtherClass.h".Тем не менее, с форвардными декларациями, вы можете сделать это вместо:

@class MyOtherClass; 

И переместите #import в файл реализация, который, как правило, скрыт от других файлов.

+0

да, я знаю. Есть ли лучший способ импортировать классы и использовать их в файле Main.m? – zerbfra

+0

@zerbfra, см. Мое редактирование. – Avi

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