在斯坦福大学的类(class)中,Paul Hegarty 更喜欢使用惰性实例化。例如他做了一个私有(private)声明
@property (strong, nonatomic) (NSArray *)cards
然后他使用getter进行初始化
- (NSArray *) cards
{
if(!_cards) _cards = [[NSArray alloc]init]
return _cards;
}
我对此很满意。但我不明白的是,在另一次 Paul 宣布对扑克牌提起公诉:
@property (strong, nonatomic) NSString *suit;
但在实现中他并没有执行这种惰性实例化。所以我不明白 suit string 的 alloc init 在哪里发生? (suit 是指向 NSString 的指针——应该在堆中占有一席之地的对象)
#import "PlayingCard.h"
@implementation PlayingCard
@synthesize suit = _suit;
- (void)setSuit:(NSString *)suit
{
if ([@[@"♣︎", @"♠︎", @"♥︎", @"♦︎"]containsObject: suit]) {
_suit = suit;
}
}
- (NSString *)suit
{
return _suit? _suit: @"?";
}
@end
最佳答案
该属性是公开的,因此他假设它将设置在某个地方。当您设置此属性时,您可以分配、初始化,然后将其设置为扑克牌实例,例如:
PlayingCard *playingCard = [PlayingCard new];
[playingCard setSuit:@"spade"];
如果属性是私有(private)的(因此您不能在类外初始化它),则使用惰性初始化,但您不想在类的init 方法中初始化它。
关于ios - 为什么不在每个 getter 中使用惰性实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23199807/