Разница между #import и @class - программирование
Подтвердить что ты не робот

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

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

#import "Class.h"

или

@class Class;

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

Спасибо заранее!

4b9b3361

Ответ 1

"# 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", чтобы сообщить компилятору дополнительную информацию, кроме как "это класс".

Ответ 2

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

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

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

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

Отличный ответ от здесь

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

@class yourCustomView;

@protocol yourCustomViewDelegate <NSObject>

@required

- (void) somethingDidInView:(UIView*)view;

@end

@interface yourCustomView : FIView