是否可以在Objective C的getter实例化中使用三元运算符?

时间:2013-11-16 08:10:51

标签: ios objective-c

假设我有一个名为甲板甲板的属性,

    @property (strong, nonatomic) Deck *deck;

我可以懒散地实例化如下,

    - (Deck *)deck{
      if(!_deck) _deck = [[Deck alloc] init];
      return _deck;
    }

但是可以使用C三元运算符懒惰地实例化它,如下所示?

    - (Deck *)deck{
     return _deck ? _deck:[[Deck alloc] init];  
    }

2 个答案:

答案 0 :(得分:7)

我实际上更喜欢你的初始版本,因为它很容易阅读。

如果您想获得更多花哨并编写更少的代码,可以使用Conditionals with Omitted Operands,这是一个GCC扩展 Clang也理解:

- (Deck *)deck{
    return _deck ? : (_deck = [[Deck alloc] init]);
}

_deck仅评估一次,仅在nil时分配。

答案 1 :(得分:2)

你可以这样做

- (Deck *)deck {
     _deck = _deck ? _deck : [[Deck alloc] init];
     return _deck;
}

如果你使用你提出的懒惰吸气剂,除非在其他地方完成,否则永远不会设置_deck ...也就是说,你实际上从未在第二种方法中设置_deck。相反,您每次都会获得一个新的Deck