iphone - 在 Objective-C 中只写属性

标签 iphone objective-c iphone-sdk-3.0 properties accessor

我被 objective-c 属性困住了。我需要的是为变量分配一个只写属性,与只读相反,即变量可以有setMethod,但不应该有getMethod。我不知道该怎么做。感谢您提供一些代码片段的答案。

最佳答案

另一种有效的方法是声明普通属性并使 getter 不可用

@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end

如果有人试图访问 getter,这将引发编译时错误。


这种方法的主要优点是您实际上拥有一个真正的属性TM,而不是一个由实例变量和 setter 伪造的代理项,这意味着:

  • 在 Xcode 中使用点符号时,您将获得自动完成功能
  • 所有运行时函数,例如 class_getPropertyclass_copyPropertyList将按预期工作。

也就是说,getter 实现无论如何都是合成的,它可以使用类似的东西调用

NSString * string = [myObj performSelector:@selector(var)];

或使用 NSInvocation (在非 id 属性的情况下)

如果您很偏执并且您真的想要阻止客户端调用 getter,您可以通过提供自己的实现来显式抛出异常。

@implementation MyClass
- (int)var {
    [NSException raise:NSInternalInconsistencyException
                format:@"property is write-only"];
}
@end

无论如何,如果有人真的想篡改您的实例变量,他们可以使用运行时来访问它,因此考虑到用例,最后的预防措施可能毫无用处。编译时错误才是您真正要找的。

关于iphone - 在 Objective-C 中只写属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4266197/

相关文章:

基于 iPhone View 的应用程序转到主视图

iphone - iCloud 文档和数据应用程序图标未知

ios - 如何将 UITableViewCell 放到 UITableView 的底部。

iphone - 将自定义中心按钮添加到标签栏的最佳方式是什么?

iphone - 如何更改 Xcode 项目名称

iphone - 更改cocos2d中的背景图片

iphone - 如何在不让应用程序在 App Store 上可用的情况下发送用于 Beta 测试的促销代码?

iphone - 将数组中的 NSString 转换为 NSDates

iphone - 如何以编程方式从应用商店获取我的应用版本

iphone - 替代 UIImage 的 imageWithCGImage :scale:orientation: