Разница между #import и @class

Недавно я смотрел учебник, в котором оратор сказал, что не имеет значения, если вы используете:

#import "Class.h" 

или:

 @class Class; 

И я должен сказать, что мои приложения работают так или иначе. Но должна быть разница? Так подумал я спросить вас, ребята.

Заранее спасибо!

«#import» вносит весь файл заголовка в текущий файл; любые файлы, в которые включен файл #imports .

@class , с другой стороны (при использовании в отдельной строке с некоторыми именами классов), просто сообщает компилятору: «Эй, скоро вы увидите новый токен, это класс, так что относитесь к нему так).

Это очень полезно, когда у вас есть потенциал для « круговых включений»; т.е. Object1.h ссылается на Object2, а Object2.h ссылается на Object1. Если вы #import both файла в другой, компилятор может запутаться, поскольку он пытается #import Object1.h, просматривает его и видит Object2.h; он пытается #import Object2.h, и видит Object1.h и т. д.

Если, с другой стороны, каждый из этих файлов имеет @class Object1; или @class Object2 ;, тогда нет круговой ссылки. Просто убедитесь, что на самом деле #import требуемые заголовки в файлы вашей реализации (.m).

Например

Если вы скажете @class myClass , компилятор знает, что он может видеть что-то вроде:

 myClass *myObject; 

Ему не нужно беспокоиться ни о чем, кроме myClass, это допустимый класс, и он должен зарезервировать место для указателя на него (на самом деле, просто указатель). Таким образом, в вашем заголовке @class хватает на 90% времени.

Однако, если вам когда-либо понадобится создать или получить доступ к членам myObject, вам нужно сообщить компилятору, что это за методы. На этом этапе (предположительно в вашем файле реализации) вам нужно будет #import "myClass.h" , чтобы сообщить компилятору дополнительную информацию, кроме как «это класс».

Согласно документации Apple:

@class позволяет объявить, что символ является именем класса Objective-c без необходимости #import файла заголовка, который определяет класс.

Вы должны использовать это, когда вам нужно только имя класса, определенное для объявления указателя на класс или параметр метода класса, и вам не нужно обращаться к каким-либо методам, полям или свойствам в классе.

Это экономит минимальное количество времени компиляции по сравнению с #import, и иногда помогает избежать беспорядочных проблем с округлением.

Отличный ответ отсюда

например, когда вы создаете протокол:

 @class yourCustomView; @protocol yourCustomViewDelegate <NSObject> @required - (void) somethingDidInView:(UIView*)view; @end @interface yourCustomView : FIView 
  • Лучший способ вызвать функцию внутри другого класса? (Swift)
  • Не удается найти объявление интерфейса для моего контроллера представления IOS
  • Какова логика наличия изменяемых и неизменных версий классов, таких как NSArray, NSDictionary и т. Д. В Objective C?
  • Статические свойства в Swift
  • Метод вызова из другого класса работает неправильно
  • Правильно ли использовать объект objc_setAssociatedObject для объекта класса?
  • Xcode не сразу распознает новые классы (iOS)
  • CMAccelerometerData class Vs. устаревший класс UIAccelerometer
  • Массив в массиве (2D-массив?)
  • Методы вызова типа в методе экземпляра
  • Именование наименований Swift Objective-C
  • Давайте будем гением компьютера.