Вы можете сделать свойство для чтения / записи только для реализации. Вы делаете это, используя расширение класса или анонимную категорию в своей реализации. Проще продемонстрировать это, например, в вашем .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.]