ios - 为什么不在每个 getter 中使用惰性实例化

标签 ios objective-c

在斯坦福大学的类(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/

相关文章:

ios - 带有两种不同颜色文本的 UILabel

ios - 我仍然可以发布没有 iPhone 6 启动图像的 iOS 应用程序(仅在缩放模式下运行的应用程序)吗?

objective-c - 如何确定两个NSD何时相隔1周?

iphone - 循环数组并在 NSMutableDictionary 中保存对象不起作用?逻辑问题?

ios - 如何在给定消息中查找电子邮件并在 iOS 中替换为 XXXXX

iphone - NSString 返回乱码

iOS Cocoa NSArrayI 长度] : unrecognized selector sent to instance

ios - Activity 指示器和警报

ios - 创建带有圆形边框 iOS 的 UIImageView

ios - 如何删除 socket 的所有引用