重写init方法后,属性声明后为什么不为nil?

发布于 2022-09-01 23:53:26 字数 1269 浏览 21 评论 0

学习Objective-C中,一般getter方法均实用if(!_variable)判断,在getter 方法中实例化。
今天遇到了一个UNRECOGNIZED SELECTOR SENT TO INSTANCE 的错误。
排查了发现声明的属性,第一次判断!_varible即为NO,运行设置断点发现属性指针已经有值。

请解释一下这个现象?

- (PlayingCardDeck *)playingCardDeck {
    BOOL noInit =!_playingCardDeck;
    NSLog(@"此处noInit 为 NO");
       
    if (noInit) {
        NSLog(@"getter is going");
        _playingCardDeck = [[PlayingCardDeck alloc] init];
        
    }
    
    return _playingCardDeck;
}

- (Card *)testCard {
    BOOL noInit =!_testCard;
    NSLog(@"此处noInit 为 YES");

    if (noInit) {
        NSLog(@"getter is going");
        _testCard = [[Card alloc] init];
        
    }
    return _testCard;
}

PlayingCardDeck的init的代码,Card为默认。

@implementation PlayingCardDeck

- (instancetype)init {
    
    self = [super init];

    if (self) {
        for (NSString *suit in [PlayingCard validSuits]) {
            for (NSUInteger rank = 1; rank <= [PlayingCard maxRank]; rank++) {
                PlayingCard *card = [[PlayingCard alloc] init];
                card.rank = rank;
                card.suit = suit;
                [self addCard:card];
            }
        }
    }
    NSLog(@"init Finished");
    return self;
}
@end 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深者入戏 2022-09-08 23:53:26

看样子你在看斯坦福的公开课,先给你加个油。

从你发出的代码来看,好像没什么问题。

再检查一下你其他部分的代码,重点看一下,在调用playingCardDeck这个属性的时候,是否 全部 用了self. playingCardDeck,而不是 _playingCardDeck。

这样重写属性getter的方式称作懒加载,好处是什么这里不多说,要注意的就是, 第一次调用这个属性的时候一定要使用self.xxx ,而不是 _xxx的方式。因为只有self.xxx才会调用getter方法。所以为了保险起见,最好除了本属性getter和setter,其他地方全部使用self.xxx的方式来调用。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文