В Objective-C нет прямой поддержки защищенных свойств или методов. Однако есть способ сделать это по соглашению. Как абстрактные методы - если кто-то хочет, он может легко нарушить это.
Вы определяете свойство, которое хотите защитить, в файле .m
.
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation DemoObject
//implementation of the class
@end
Свойство атомное - по умолчанию.
Тогда вы наследуете от DemoObject
:
.h
файл
@interface InheritingObject : DemoObject
@end
.m файл
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation InheritingObject
- (instancetype)init {
if (self == [super init]) {
self.protectedString = @"Some String";
}
return self;
}
@end
В основном здесь произошло то, что мы создали расширение DemoObject
, которое предоставляет нам необходимое нам свойство InheritingObject
. Любой объект, который использует DemoObject
, не видит свойство protectedString
, поскольку оно не определено в его файле .h
. Классы, которые видят свойство, - это те, которые определяют расширение DemoObject
.
На самом деле вы можете таким образом выставить свойство для любого класса, а не только производного. Так что это соглашение легко нарушить. Однако это создает какой-то порядок и иллюзию защищенной области.