Public iVar; только для чтения из других классов - PullRequest
1 голос
/ 24 февраля 2012

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

Есть ли несколько способов?

Единственный способ, которым я могу придумать, - это установить @property (readonly) для iVar, но не использовать точечную нотацию внутри класса-владельца (который, я думаю, не будет работать только для чтения), а в классе-владельце ссылаться на него напрямую, без точечной нотации, затем в другом классе, ссылаться на него с точечной нотацией.

Но мне любопытно, есть ли другие методы.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

Вы можете сделать свойство для чтения / записи только для реализации. Вы делаете это, используя расширение класса или анонимную категорию в своей реализации. Проще продемонстрировать это, например, в вашем .h:

@interface MyClass

@property (readonly) NSInteger age;
...

@end

и в вашем .m:

@interface MyClass () // class extension/anonymous category for private methods & properties
                      // implementation of these go in main @implementation

@property (readwrite) NSInteger age;
...

@end

@implementation MyClass

@synthesize age;
...

@end

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

Вы делаете то же самое для частных методов.

[Примечание: Это Objective-C, поэтому вышеприведенное не является пуленепробиваемым - есть способы обойти вызов метода установки свойств - но компилятор будет отмечать ошибки, которые присваивают свойству извне класса. ]

После комментариев:

[Примечание 2: анонимное расширение категории / класса очень похоже на именованную категорию. Первый должен быть реализован в основной реализации, второй может быть реализован в @implementation classname (categoryname) или в основной реализации. Кроме того, только основной интерфейс, интерфейс для расширения класса / анонимной категории и основная реализация могут объявлять переменные экземпляра; интерфейсы и реализации для именованных категорий не могут. Свойства могут быть объявлены как в анонимных, так и в именованных категориях, однако они могут быть синтезированы только в основной реализации, а не в реализациях именованных категорий. Эта заметка верна во время печати, некоторые из этих функций изменились по мере развития Objective-C / Xcode.]

0 голосов
/ 24 февраля 2012

Используйте спецификатор private для ivars и расширение класса для определения метода доступа - таким образом, ivar является приватным для класса.

// FooClass.h @interface FooClass: NSObject { @private int boo;

} @ Конец

// FooClass.m

@ interface FooClass () {

}

@ свойство (nonatomic, assign) int boo;

@ конец

@ реализация FooClass

@ synthes boo; // ....

@ конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...