objective c – импортировать файл .m и .h – что он делает

В объективе c, что на самом деле произошло, когда вы говорите #import «MyClass.h»? (Компилятор что-то копирует для вас?)

  1. В файле MyClass.m, если я #import "UsefulClass.h" , это означает, что UsefulClass становится доступным в этом файле, и я могу создать объект и отправить сообщение его экземпляру.

  2. В файле myClass.m я должен #import "MyClass.h" , это похоже на #import "MyClass.h" моего файла реализации на его заголовок (называемый базовым файлом?), Который отличается от того, что делает первый. Так что #import делает два разных типа вещей, основанных на обстоятельствах? Или это действительно относится к одной категории с другой точки зрения.

  3. Метод, определенный в файле .m, но не в файле .h, считается закрытым. Из другого classа я могу каким-то образом вызвать частный метод? (например, если я #import .m вместо .h? поэтому class будет знать о том, что определяет файл реализации.)

  4. В чем разница между объектами-c #import и c #include ?

  5. Также @interface MyClass : NSObject используется в файле .h, а @interface MyClass() используется в файле .m. Это просто формат синтаксиса (например, скобка), когда вы хотите иметь частные свойства? или есть ли какая-то логика этого?

    Компилятор что-то копирует для вас? [когда вы говорите #import "myClass.h" ]?

    Нет. Директива препроцессора #import почти идентична директиве #include , за исключением того, что для нее не требуется защита включения – конструкция, заимствованная из C, которая не выглядит интуитивно понятной.

    1. Самый простой способ визуализировать то, что происходит, когда #import .h заголовок в .m-файл состоит в том, чтобы представить, что содержимое этого заголовка полностью помещено в строку, заменяющую #import . По сути, это то, что делает препроцессор.
    2. То же самое происходит, как в # 1 – это не имеет значения для препроцессора, если заголовок связан с файлом .m или нет.
    3. Более общий способ определения частных методов и частных переменных экземпляра – объявить их в расширениях classов (см. Пункт 5). Это позволяет объявить все ваши методы, что хорошо. Есть способы вызвать частный метод в Objective-C – вы могли бы сделать это через reflection, или вы могли бы подделать его, указав подпись в другом classе, а затем вызывая ее в classе по вашему выбору. Компилятор будет предупреждать, но он должен подчиняться.
    4. Я упомянул выше, что нет необходимости использовать охранники включения с #import .
    5. Интерфейс с пустыми скобками является расширением classа. Это похоже на категорию, но позволяет добавлять переменные экземпляра в ваш class.

    #include текстовое копирование содержимого указанного файла в место, где появляется директива. Файл .h для classа содержит объявление интерфейса для classа, поэтому вы копируете декларацию classа. В обоих случаях (из файла classа .m или другого файла) вы просто копируете декларацию.

    Что касается #import , это точно так же, как #include , за исключением того, что он отслеживает, какие файлы он содержит, поэтому вы не получите тот же class, который был объявлен кучей раз.

    .h (заголовочный файл) – это интерфейс вашего classа и содержит «общее описание» вашего classа. Когда вы видите интерфейс, вы можете сказать, что на самом деле делает ваш class. Иногда интерфейс может содержать небольшую информацию или быть пустым – это означает, что ваш class может содержать частные методы, и вы не можете получить к ним доступ через интерфейс classа.

    .m (файл сообщения в objC или .c в C или .cpp в C ++ или .mm в objC ++) – это реализация вашего classа.

    1 -> Когда препроцессор видит директиву #import , он заменяет строку #import "UsefulClass.h" текстом файла «ПолезныйClass.h», поэтому ваш class MyClass теперь «знаком» с classом «Полезный class» и может использовать его методов или переменных.

    2 -> Помните, что этот class всегда состоит из интерфейса и реализации (.h + .m). Вот почему вы должны импортировать свой заголовок в файл .m. Таким образом, #import делает то же самое в первой ситуации, а во втором.

    3 -> Да, вы можете получить доступ к приватным методам. Первый способ: вы можете наследовать от classа, и все его методы (частные и общедоступные) (родительский class) становятся доступными в вашем дочернем classе. Второй способ: да, вы можете импортировать файл .m. НО! Все это не рекомендуется. По соглашению вы никогда не должны обращаться к приватным методам. Когда разработчик делает частные методы, у него должна быть веская причина. В общем, objC не имеет частных методов. Расширение ObjC – это имитация частного метода, поэтому разработчик objC должен быть осторожным.

    4 -> Рекомендуется использовать #include в C и #import (или @import в современной версии языка) в objC. Из книги «Изучите Objective-C на Mac для OS X и iOS» Скотта Кнастера, Вакар Малик, Марк Далримпл:

    #import гарантирует, что заголовочный файл будет включен только один раз, независимо от того, сколько раз директива #import действительно просматривается для этого файла. Примечание. В C программисты обычно используют схему, основанную на директиве #ifdef, чтобы избежать ситуации, когда один файл содержит второй файл, который затем рекурсивно включает в себя первый. В Objective-C программисты используют #import для выполнения того же самого.

    5 -> @interface MyClass() – категория objC с пустым именем, называемым расширением (это только концепция objC), посмотрите на документацию, чтобы понять ее. Но помните, что это не на самом деле частная вещь, это всего лишь подражание.