В значительной степени. Среды IDE, используемые для разработки на C # и Java (и на динамических языках также и интерпретатор, например, Ruby), динамически создают список функций, доступных в данном классе, на основе определения класса (в частности, на основе модификаторов public / private / protected) , В ObjectiveC у нас нет этих модификаторов (или, по крайней мере, до недавнего времени), и файл .h по сути является способом перечисления только тех переменных и методов, которые должны использоваться другими классами.
Другими словами, компилятор использует файлы .h для кэширования объявлений, доступных для других классов (включая дочерние классы, которые наследуют эти объявления от базового класса).
Тем не менее, это не вся картина, потому что в ObjectiveC методы вызываются динамически. Например, вам не нужно указывать объявление в файле .h, чтобы другой класс мог вызывать метод, определенный только в файле .m. В Java ссылки на конкретные методы разрешаются во время компиляции. Когда метод не определен, другой код не может вызвать его. В ObjectiveC, когда фрагмент кода вызывает метод, он фактически отправляет сообщение классу для выполнения этого метода. Во время выполнения диспетчер проверяет, отвечает ли объект на это сообщение, и если да, вызывает этот метод. Это конечно упрощение. Посетите страницу Википедии о ObjectiveC для более подробной информации (особенно в разделе Сообщения).
Разделение между объявлением и определением происходит от C. Одна функция или переменная может иметь много объявлений, но только одно определение. Когда файл .h импортируется в начале файла .m, его содержимое эффективно добавляется в этот файл .m во время компиляции (вместе с другими файлами .h, на которые есть ссылки в этих файлах). Если, например, файл a.m
должен был быть импортирован в файлы b.m
и c.m
, то, фактически, во время компиляции и b.m
, и c.m
будут иметь дублированные определения переменных и методов, определенных в a.m
(например, переменная определенный в a.m
будет храниться по разным адресам, когда a.m
будет импортирован и затем скомпилирован в b.m
или c.m
).