为什么readonly属性setter工作目标c

时间:2015-03-22 02:00:22

标签: objective-c xcode setter getter synthesize

@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的值。我做错了什么?

2 个答案:

答案 0 :(得分:2)

readonly并不能阻止您编写自己的二传手。它只是阻止编译器为您合成一个setter。如果它为readonly属性实现了一个setter,但它不会警告你,那将会很好。

显然,不建议为readonly属性实现setter。此外,你通常也不会声明ivar,也不会实现属性的getter,因为那些都是为你合成的(除非你在那里做了一些特别的事情,你不是)。 / p>

答案 1 :(得分:0)

如果要在objective-c中创建属性,它会为您创建3件事。

  1. 您可以在属性名称前使用下划线访问的实例变量。例如:_nmbr
  2. 一个getter方法,您可以使用属性名称直接调用它。例如:[self nmbr];这实际上会调用- (NSNumber *)nmbr {}方法。
  3. 一个setter方法,您可以在它之前使用'set'关键字进行调用。例如:[self setNmbr:@1];这实际上会调用- (void)setNmbr:(NSNumber *)nmbr {}方法。
  4. 说,你不需要明确定义getter和setter。 Objective-C默认为您提供这些getter和setter。

    您可以在上述问题中访问setter,因为您明确设置了它们,而不需要这样做。

    希望这有帮助。