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

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

#import "Class.h" 

или:

 @class Class; 

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

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

2 Solutions collect form web for “Разница между #import и @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 
  • Проведите между различными экранами (представлениями) с помощью раскадровки
  • Симулятор XCode5: неизвестный символ опции `X 'в: -Xlinker
  • использовать pdfs как источник текстур в редакторе уровней спрайтов Xcode 6
  • Разрешить пользователю отменять MBProgressHUD, когда вызов JSON занимает слишком много времени
  • Преобразование покупки xcodeproj в приложение в файл pkg из терминала (Bash) или как преобразовать файл xcarchive в файл pkg?
  • Сбой класса в производстве, но не отладка
  • Расширение Watchkit - не найдено соответствующих профилей подготовки
  • Добавление модульных тестов в уже существующий проект?
  • Swift 3: невозможно подключиться к периферии через BLE
  • Использование моего собственного объекта Cell в XCODE
  • Создайте iPhone с шестью плюсовыми элементами интерфейса (желательно с Autolayout)
  • Interesting Posts

    Xcode не перешагнет сбой

    одинарная точка несколько раз и более естественно

    MKAnnotationView viewForAnnotation никогда не вызывал

    Использование int в качестве ключа NSDictionary?

    Использование FBEvents activateApp на IOS, а телефонная разметка не публикуется в Facebook Insights

    IOS: правила сканирования Bluetooth низкой мощности (BLE)

    Быстрая загрузка видео и воспроизведение без буферизации видео с URL-адреса

    Установлен API Google Диска, но есть ошибка «нет такого модуля« GoogleAPIClient »»

    Swift: исключение при попытке печати CLLocationSpeed ​​«неожиданно найдено нуль при развертывании необязательного значения»

    неправильный рекламный идентификатор

    Ошибка утверждения в – с NSFetchedResultsController

    UIDocumentInteractionController занимает много времени, чтобы показать параметры

    CoreNFC для эмуляции карт?

    Сортируйте NSMutableArray UIView в соответствии с их frame.origin.y

    Почему инициализация элементов initWithCoder не выполняется правильно?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.