цель-C как объявить частную собственность для категории?

Я новичок в объективе-С, поэтому извиняюсь, если это повторяется где-то. У меня есть категория (?), Что-то вроде:

внутри SomeClass.h :

 @interface SomeClass (SomeCategory) <SomeDelegate> @property (nonatomic, retain) id somePublicProperty; @property (nonatomic, retain) id someProperty; // <-- i want to move this to "private" @end 

и теперь в моем SomeClass.m , все, что у меня есть:

 @implementation SomeClass (SomeCategory) // dynamic setters/getters here for someProperty. @end 

Я думаю, что someProperty является публичным. как сделать это «частным»? (другими словами, как синтаксически поместить это в файл .m ? Я пытался использовать

 @interface SomeClass (SomeCategory) { @property (nonatomic, retain) somePrivateProperty; } @end 

но он просто жалуется, что у меня есть дублирующее определение категории. как я это делаю правильно?

    Просто добавьте определение категории в файл .m вне блока реализации

    Вот так:

     @interface MyClass (MyCategory) @property (assign) BOOL myPrivateProperty; @end @implementation MyClass ... @end 

    В вашем файле .h вы не должны указывать категорию. Просто используйте:

     @interface SomeClass : SomeBaseClass < SomeDelegate> @property (nonatomic, retain) id somePublicProperty; @end 

    В своем .m файле укажите свою частную собственность внутри расширения класса :

     @interface SomeClass () @property (nonatomic, retain) id somePrivateProperty; @end 

    Расширение класса не является подобной категорией, поскольку позволяет расширять интерфейс, а также добавлять новое хранилище в ваш класс.

    В категории классов вы можете определить новые свойства, но для него не будет выделено никакого хранилища , поэтому вам нужно сделать это вручную:

     @interface SomeClass (SomeBaseCategory) @property (nonatomic, retain) id somePrivateProperty; @end @implementation SomeClass { id _somePrivateProperty; } - (void)setSomePrivateProperty:(id)property { _somePrivateProperty = property; } - (id)somePrivateProperty { return _somePrivateProperty; } @end 

    В противном случае ваше приложение выйдет из строя.

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

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

    Если у вас нет исходного кода для реализации класса, вы не можете определить расширение класса (в соответствии с указанным выше источником).

    В этом случае вы можете использовать ассоциацию объектов для определения свойств .

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

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

    Если вам действительно нужно добавить свойства к этому объекту, способ сделать это с объектами связанного с Objective-C

    Есть отличная запись о том, когда / как их использовать здесь

    Давайте будем гением компьютера.