Когда свойства в расширении класса добавляются в класс в Objective C?
У меня сложилось впечатление, что расширения классов в Objective C были просто анонимными категориями. Однако вы можете добавить свойства к этим расширениям классов, что невозможно в категориях, поэтому я немного запутался:
#import "Money.h"
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Money
@end
Как реализуются расширения классов? Как категории? Тогда почему вы можете добавить iVars к нему? Когда расширения класса добавляются в класс, во время компиляции или когда класс загружается?
1 ответ
Расширения классов - это механизм компилятора, который позволяет смещать подмножество переменных экземпляра, объявленных свойств и методов, объявленных в @interface
к конкретной единице перевода (например, из файла открытого заголовка в файл реализации), что позволяет файлам заголовка объявлять только то, что должно быть общедоступным. С точки зрения времени выполнения, расширения не существуют: все, что объявлено в расширении класса, объединяется с основным классом. Это подразумевает, что расширения должны быть скомпилированы вдоль его основного класса (в отличие от категорий), что вы можете сделать вывод из того факта, что у вас есть один @implementation
как для основного класса, так и для его расширения. Это все часть одного класса.
Как видите, расширения классов сильно отличаются от категорий. Категории не могут объявлять переменные экземпляра, категории могут находиться в файлах реализации, отличных от тех, которые реализуют основной класс (включая классы, объявленные и реализованные в библиотеках), и они имеют свои собственные @implementation
, Кроме того, категории явно загружаются и присоединяются к основному классу во время выполнения.