Почему Objective-C использует заголовочные файлы вместо однофайловых классов, таких как Java? - PullRequest
14 голосов
/ 11 августа 2011

Я в основном работаю на Java и недавно пытаюсь изучить Objective-C для Mac и разработки приложений для iOS.Теперь этот язык сильно отличается от того, к чему я привык, указателей, сообщений и т. Д., Но, похоже, я все понял.Это, конечно, не проблема кодирования, но я бы скорее был хорошо знаком с тем, с чем имею дело, а не просто знал, что «так должно быть только потому, что так оно и есть».

Почемуязыку Objective-C нужны заголовочные файлы ?Какова их реальная цель быть отделенным от файла .m?Почему функции должны быть объявлены в заголовке, а не только что реализованы?Это просто одна из тех вещей, которые просто не исчезли из старого языка, или есть реальное преимущество по сравнению с однофайловыми классами Java?

Ответы [ 3 ]

14 голосов
/ 11 августа 2011

В основном файлы .h существуют из-за обратной совместимости C - весь код C также является допустимым кодом Objective-C.Компилятор AC работает по одному файлу за раз;каждый файл компилируется и анализируется независимо.Компилятор C "должен" видеть объявление определенного символа перед его первым использованием.Итак, если вы используете класс A в Bm, в какой-то момент компилятор должен увидеть объявление A;во избежание таких действий, как #include "A.m", условием является разделение объявлений в заголовочных файлах и реализация в файлах .c, .m, .cpp ....

Другие языки, такие как Java, автоматически сканируют файлы втот же каталог B.java при компиляции, чтобы найти объявление других классов;Компиляторы C немного "старше" и требуют, чтобы вы #include все необходимые заголовки.

Короче говоря: в основном исторические причины.

7 голосов
/ 11 августа 2011

Запись в Википедии для заголовочных файлов использует то же сравнение с Java, что и вы, что является плюсом:

Некоторые языки программирования (в первую очередь C, C ++ иObjective-C) использовать заголовочные файлы.Эти файлы позволяют программистам разделять определенные элементы исходного кода программы на файлы многократного использования.Заголовочные файлы обычно содержат прямые объявления классов, подпрограмм, переменных и других идентификаторов.Программисты, которые хотят объявлять стандартизированные идентификаторы в более чем одном исходном файле, могут помещать такие идентификаторы в один файл заголовка, который затем может включать другой код всякий раз, когда требуется содержимое заголовка.Это должно держать интерфейс в заголовке отдельно от реализации.Стандартная библиотека C и стандартная библиотека C ++ традиционно объявляют свои стандартные функции в заголовочных файлах.

Более новые скомпилированные языки (такие как Java, C #) не используют предварительные объявления;идентификаторы распознаются автоматически из исходных файлов и считываются непосредственно из символов динамической библиотеки.Это означает, что заголовочные файлы не нужны.

5 голосов
/ 11 августа 2011

Вам не нужно иметь заголовочные файлы.Вы можете иметь свой интерфейс и реализацию в одном и том же файле, но их легче разделить, а также упрощает импорт классов, а это означает, что другие классы не наследуют загрузку ненужных им вещей из .m (например, константы).).

...