Kin*_*ven 29 iphone properties objective-c accessor iphone-sdk-3.0
我坚持使用objective-c属性.我需要的是为变量分配一个只写属性,与readonly完全相反,即变量可以有setMethod,但它不应该有getMethod.我不知道怎么做.一些代码片段的答案表示赞赏.
Gab*_*lla 50
另一种有效的方法是声明普通属性并使getter不可用
@interface MyClass
@property NSString * var;
- (NSString *)var UNAVAILABLE_ATTRIBUTE;
@end
Run Code Online (Sandbox Code Playgroud)
如果有人试图访问getter,这将引发编译时错误.
这种方法的主要优点是你实际上有一个不动产TM而不是由实例变量和一个setter伪造的代理,这意味着:
class_getProperty和
class_copyPropertyList将按预期工作.也就是说,无论如何都会合成getter实现,并且可以使用类似的东西调用它
NSString * string = [myObj performSelector:@selector(var)];
Run Code Online (Sandbox Code Playgroud)
或使用NSInvocation(如果是非id财产)
如果你是偏执狂并且你真的想阻止客户端调用getter,你可以通过提供自己的实现来显式抛出异常.
@implementation MyClass
- (int)var {
[NSException raise:NSInternalInconsistencyException
format:@"property is write-only"];
}
@end
Run Code Online (Sandbox Code Playgroud)
无论如何,如果有人真的想要篡改你的实例变量,他们可以使用运行时来访问它,所以考虑到用例,最后的预防措施可能是无用的.您正在寻找编译时错误.
Bru*_*sso 12
你可以这样做:
@interface MyClass {
@private
int _var;
}
- (void)setVar:(int)newVar;
@end
@implementation MyClass
- (void)setVar:(int)newVar {
_var = newVar;
}
@end
Run Code Online (Sandbox Code Playgroud)
现在,您可以var像只写的属性一样访问变量:
@implementation SomeOtherClass
...
MyClass c = [[MyClass alloc] init];
c.var = 3;
...
@end
Run Code Online (Sandbox Code Playgroud)
如果你试图读取假属性,编译器会警告你.
这有什么理由需要成为财产吗?我只是将setter声明为方法并使用普通[foo setVar:bar]语法.
| 归档时间: |
|
| 查看次数: |
8978 次 |
| 最近记录: |