簡體   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