Категории Objective-C не позволяют добавлять переменные экземпляра

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

А также я узнал, что с помощью объектов, связанных с Objective-C, мы можем это сделать. Но меня больше интересует, что является основной причиной этого.


person sanjayzed    schedule 10.09.2016    source источник


Ответы (1)


Ответ отредактирован, чтобы говорить о переменных экземпляра, а не о свойствах.

Добавление переменных экземпляра к объекту изменяет распределение памяти объекта и требует перекомпиляции объекта. Категории добавляют новые методы к существующим объектам, не требуя повторной компиляции, и поэтому не могут добавлять переменные экземпляра.

Как вы говорите, вы можете добавлять свойства, в которых данные сохраняются и загружаются с использованием ассоциативного хранилища.

РЕДАКТИРОВАТЬ:

Если у вас есть класс 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
comment
как продемонстрировать Добавление сохраненных свойств к объекту изменяет распределение памяти объекта. не могли бы вы привести мне один пример. Спасибо за ответ - person sanjayzed; 10.09.2016
comment
Смотрите редактирование моего ответа. - person Duncan C; 10.09.2016
comment
Пожалуйста, исправьте терминологию. Категории Objective-C позволяют добавлять свойства. Они не позволяют добавлять переменные экземпляра. - person rmaddy; 10.09.2016
comment
rmaddy, хорошее замечание. Я отредактирую свой ответ. - person Duncan C; 11.09.2016
comment
Дункан. Спасибо за краткое объяснение. Я понял концепцию категорий и расширений. Я до сих пор не понимаю, как при добавлении ivar к объекту изменяет его местоположение в памяти и требует перекомпиляции объектов. - person sanjayzed; 11.09.2016
comment
@sanjayzed, см. связанный повторяющийся вопрос для более подробного обсуждения. - person Duncan C; 11.09.2016