Импорт заголовка в цель c

В Objective-c, когда мы используем объект одного класса в другом классе по соглашению, мы должны заранее объявить класс в файле .h, т.е.@class classname;, И следует импортировать заголовочный файл в файл .m, т.е.#import "header.h". But if we import the header file in .h then we don't have to import it again in .m file . So what is the reason behind this convention? Which is efficient way?

Ответы на вопрос(5)

Решение Вопроса

Вы должны поддержать предварительные декларации (@class MONClass;) где это возможно, потому что компилятор должен знать, что имя типа является классом objc перед его использованием, и потому что#import может перетаскивать кучу других заголовков (например, целые фреймворки / библиотеки), серьезно расширяя и усложняя ваши зависимости и увеличивая время сборки.

Which is efficient way?

Форвард декларации. Ваши сборки, перестройки и индексация будутmuch быстрее, если вы делаете это правильно.

 06 дек. 2012 г., 16:01
Поэтому, чтобы уточнить, если я объявляю тип в файле .h, который я пересылаю, объявляю с использованием @classname, то в файле .m, куда я отправляю сообщения объекту, я импортирую фактический заголовочный файл & quot; classname.h & quot; ?
 06 дек. 2012 г., 21:18
@ Конор правильно. хотя есть еще несколько деталей:stackoverflow.com/questions/322597/class-vs-import/… За последние несколько лет усовершенствования компилятора и изменения языка (в ObjC) облегчили сохранение вашего класса & apos; зависимости из заголовка - все это может идти в*.m во многих случаях. поэтому вам понадобится ваш суперкласс и любые протоколы, которые вы принимаете публично. Ваши ivars и свойства часто могут остаться вне заголовка - в этих случаях не требуется импорт или пересылка.

что импорт заголовка в .h делает подобное проще (в краткосрочной перспективе). Причина не делать этого и импортировать его в файл реализации (.m) состоит в том, чтобы предотвратить загрязнение имен, когда все имена в импортированном заголовке доступны, когда кто-то импортирует ваш заголовок. Вместо этого, импортируя ваш заголовок, должны импортироваться только ваши функции / классы, а остальное в реализации

Кроме того, если вы импортируете заголовок в .h, это означает, что каждый код, импортировавший ваш заголовок, должен будет перекомпилироваться при изменении стороннего заголовка, даже если ничего явно не изменилось в вашем заголовке. Прямое объявление устраняет эту проблему и заставляет перекомпилировать только те файлы реализации (.m), которые фактически используют сторонний заголовок.

но существует общее мнение, что импорт может повлиять на время загрузки и время отклика, да, это влияет и не влияет. Так как согласно документации Apple: -

If you are worried that including a master header file may cause your program to bloat, don’t worry. Because Mac OS X interfaces are implemented using frameworks, the code for those interfaces resides in a dynamic shared library and not in your executable. In addition, only the code used by your program is ever loaded into memory at runtime, so your in-memory footprint similarly stays small.

As for including a large number of header files during compilation, once again, don’t worry. Xcode provides a precompiled header facility to speed up compile times. By compiling all the framework headers at once, there is no need to recompile the headers unless you add a new framework. In the meantime, you can use any interface from the included frameworks with little or no performance penalty.

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

#import директива препроцессора, которая работает с файлом до того, как его увидит компилятор Всякий раз, когда вы запутались, концептуально думайте об этом как о копировании и вставке: когда вы видите#import foo, означает, что содержимое файла foo вставляется в этот момент. (Это немного умнее, так как оно защищает от дубликатов).

Так что вы#import Foo.h вBar.h если есть объявления вBar.h эта ссылкаFoo.h, Если нет ничего вBar.h который использует Foo, но естьBar.m, то импорт идет вBar.m, Храните декларации только там, где они нужны.

компилятор, у нас есть класс с именем xx, если вы используете @class xx;

Потому что вам не нужны его свойства / метод прямо сейчас.

И в следующем случае вам также понадобятся свойство и методы, потому что вам нужно будет получить к ним доступ. Это проблема, если вы используете @class xx в своем файле .h и не импортируете xx.h. Тогда объявление объекта xx не будет генерировать ошибку, но доступ к его методу вызовет предупреждение, а доступ к свойству вызовет ошибку.

 11 мая 2012 г., 20:00
Я не хочу быть резким, но ваш ответ было бы намного легче читать (и, следовательно, голосовать), если вы использовали заглавные буквы в начале предложений и не использовали нестандартные сокращения / орфографии, такие как «becz», «cz». и "обряд".

Ваш ответ на вопрос