Ответ отредактирован, чтобы говорить о переменных экземпляра, а не о свойствах.
Добавление переменных экземпляра к объекту изменяет распределение памяти объекта и требует перекомпиляции объекта. Категории добавляют новые методы к существующим объектам, не требуя повторной компиляции, и поэтому не могут добавлять переменные экземпляра.
Как вы говорите, вы можете добавлять свойства, в которых данные сохраняются и загружаются с использованием ассоциативного хранилища.
РЕДАКТИРОВАТЬ:
Если у вас есть класс FooClass с таким заголовком:
//FooClass.h
@interface FooClass : NSObject
@property (nonatomic, strong) NSString *bar1;
@end
Это определяет класс с 1 свойством bar1
и поддерживается переменной экземпляра _bar1
.
Внешняя категория FooClass
не могла добавить дополнительные переменные экземпляра в FooClass
.
Однако вы можете создать частную категорию в файле .m для FooClass, которая МОЖЕТ определять дополнительные свойства (с резервными переменными экземпляра) для класса. Это работает, потому что эти дополнительные переменные экземпляра известны во время компиляции и могут быть встроены в класс. Вот пример:
// FooClass.m
@interface FooClass()
@property (nonatomic, strong) NSString*bar2;
@end
@implementation FooClass
@end
Обратите внимание на дополнительное объявление @interface с дополнительным свойством. Поскольку он находится в том же .m-файле, что и реализация, он не отображается в других файлах, но известен во время компиляции, поэтому компилятор может добавить необходимые переменные экземпляра.
person
Duncan C
schedule
10.09.2016