Когда свойства в расширении класса добавляются в класс в Objective C?

У меня сложилось впечатление, что расширения классов в Objective C были просто анонимными категориями. Однако вы можете добавить свойства к этим расширениям классов, что невозможно в категориях, поэтому я немного запутался:

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end

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

1 ответ

Решение

Расширения классов - это механизм компилятора, который позволяет смещать подмножество переменных экземпляра, объявленных свойств и методов, объявленных в @interface к конкретной единице перевода (например, из файла открытого заголовка в файл реализации), что позволяет файлам заголовка объявлять только то, что должно быть общедоступным. С точки зрения времени выполнения, расширения не существуют: все, что объявлено в расширении класса, объединяется с основным классом. Это подразумевает, что расширения должны быть скомпилированы вдоль его основного класса (в отличие от категорий), что вы можете сделать вывод из того факта, что у вас есть один @implementation как для основного класса, так и для его расширения. Это все часть одного класса.

Как видите, расширения классов сильно отличаются от категорий. Категории не могут объявлять переменные экземпляра, категории могут находиться в файлах реализации, отличных от тех, которые реализуют основной класс (включая классы, объявленные и реализованные в библиотеках), и они имеют свои собственные @implementation, Кроме того, категории явно загружаются и присоединяются к основному классу во время выполнения.

Другие вопросы по тегам