Другой допустимый подход - объявить обычное свойство и сделать метод получения недоступным
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
Это вызовет ошибку времени компиляции в случае, если кто-то попытается получить доступ к модулю.
Основным преимуществом этого подхода является то, что у вас есть реальное свойство TM , а не суррогат, подделанный переменной экземпляра и установщиком, что подразумевает, что:
- вы получите автоматическое завершение при использовании точечного обозначения в Xcode
- все функции времени выполнения, такие как
class_getProperty
и class_copyPropertyList
, будут работать как положено.
Тем не менее, реализация метода получения в любом случае синтезируется, и ее можно вызывать с использованием чего-то вроде
NSString * string = [myObj performSelector:@selector(var)];
или с использованием NSInvocation
(в случае свойства, отличного от id
)
Если вы параноик и вы действительно хотите запретить клиенту вызывать метод получения, вы можете явно вызвать исключение, предоставив собственную реализацию.
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
В любом случае, если кто-то серьезнохотетьвмешиваться в вашу переменную экземпляра, они могут использовать среду выполнения для доступа к ней, поэтому последняя мера предосторожности, вероятно, бесполезна, учитывая вариант использования.Ошибка времени компиляции - это то, что вы действительно ищете.