@interface ViewController : UIViewController{
NSNumber *nmbr;
}
@property (nonatomic, readonly) NSNumber *nmbr;
- (NSNumber*)nmbr;
- (void)setNmbr:(NSNumber *)value;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setNmbr:[NSNumber numberWithInt:4]];
NSLog(@"Value of number is: %@", self.nmbr);
}
- (NSNumber*)nmbr{
return nmbr;
}
- (void)setNmbr:(NSNumber *)value{
nmbr = value;
}
@end
我希望程序不要让setNmbr函数工作,因为接口文件中的nmbr属性是只读的。但它设定的是nmbr的值。我做错了什么?
答案 0 :(得分:2)
readonly
并不能阻止您编写自己的二传手。它只是阻止编译器为您合成一个setter。如果它为readonly
属性实现了一个setter,但它不会警告你,那将会很好。
显然,不建议为readonly
属性实现setter。此外,你通常也不会声明ivar,也不会实现属性的getter,因为那些都是为你合成的(除非你在那里做了一些特别的事情,你不是)。 / p>
答案 1 :(得分:0)
如果要在objective-c中创建属性,它会为您创建3件事。
_nmbr
[self nmbr];
这实际上会调用- (NSNumber *)nmbr {}
方法。[self setNmbr:@1];
这实际上会调用- (void)setNmbr:(NSNumber *)nmbr {}
方法。说,你不需要明确定义getter和setter。 Objective-C默认为您提供这些getter和setter。
您可以在上述问题中访问setter,因为您明确设置了它们,而不需要这样做。
希望这有帮助。