我被 objective-c 属性困住了。我需要的是为变量分配一个只写属性,与只读相反,即变量可以有setMethod
,但不应该有getMethod
。我不知道该怎么做。感谢您提供一些代码片段的答案。
最佳答案
另一种有效的方法是声明普通属性并使 getter 不可用
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
如果有人试图访问 getter,这将引发编译时错误。
这种方法的主要优点是您实际上拥有一个真正的属性TM,而不是一个由实例变量和 setter 伪造的代理项,这意味着:
- 在 Xcode 中使用点符号时,您将获得自动完成功能
- 所有运行时函数,例如
class_getProperty
和class_copyPropertyList
将按预期工作。
也就是说,getter 实现无论如何都是合成的,它可以使用类似的东西调用
NSString * string = [myObj performSelector:@selector(var)];
或使用 NSInvocation
(在非 id
属性的情况下)
如果您很偏执并且您真的想要阻止客户端调用 getter,您可以通过提供自己的实现来显式抛出异常。
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
无论如何,如果有人真的想篡改您的实例变量,他们可以使用运行时来访问它,因此考虑到用例,最后的预防措施可能毫无用处。编译时错误才是您真正要找的。p>
关于iphone - 在 Objective-C 中只写属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4266197/