繁体   English   中英

为什么只读属性设置器是工作目标c

[英]why readonly property setter is working objective c

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

readonly不会阻止您编写自己的设置器。 它只是阻止编译器为您合成设置器。 如果您为readonly属性实现了setter,但它会警告您,那会很好,但事实并非如此。

显然,不建议为readonly属性实现setter。 此外,您通常甚至都不会声明该ivar,也不会实现该属性的getter,因为它们都将为您合成(除非您在那里进行了特殊的操作,否则就不会)。

如果要在Objective-C中创建属性,它将为您创建3件事。

  1. 一个实例变量,您可以通过在属性名称前使用下划线来访问它。 例如: _nmbr
  2. 一个可以通过使用属性名称直接调用的getter方法。 例如: [self nmbr]; 这实际上将调用- (NSNumber *)nmbr {}方法。
  3. setter方法,您可以在其前使用“ set”关键字来调用它。 例如: [self setNmbr:@1]; 这实际上将调用- (void)setNmbr:(NSNumber *)nmbr {}方法。

就是说,您不需要显式定义getter和setter。 默认情况下,Objective-C为您提供这些吸气剂和吸气剂。

您可以访问上述问题中的设置器,因为您明确设置了不需要的设置器。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM