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

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

#import "Money.h"

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

@implementation Money

@end

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


person cfischer    schedule 19.06.2013    source источник


Ответы (1)


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

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

person Community    schedule 19.06.2013
comment
Спасибо, теперь это имеет смысл. :-) - person cfischer; 19.06.2013
comment
Не могли бы вы взглянуть на этот связанный вопрос? stackoverflow.com/questions/17192443/ - person cfischer; 19.06.2013
comment
Вы вернулись!! Отлично! - person jscs; 04.07.2013