ios 惰性示例化

kiz8lqtg  于 2022-11-19  发布在  iOS
关注(0)|答案(3)|浏览(125)

我只是不明白什么时候应该使用惰性示例化。不过我理解惰性示例化的基本概念。
“我知道Objective-C中所有的属性都以nil开始,并且向nil发送消息什么也不做,因此必须使用[[Class alloc] init]进行初始化;在将消息发送到新创建的属性之前。“(Lazy instantiation in Objective-C/ iPhone development
m.file:

@property (strong, nonatomic) NSMutableArray *cards; 

- (NSMutableArray *)cards
{
    if (!_cards) _cards = [[NSMutableArray alloc] init];
    return _cards;
}

- (void)addCard:(Card *)card atTop:(BOOL)atTop
{
    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
} }

好吧,我真正不明白的是我应该在什么时候使用这种类型的示例化?我看到的代码大多是这样的:
h.file:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;

m.file:

if([card.contents isEqualToString:self.contents]){
        score = 1;
    }
  • 这可能是一个愚蠢的问题,但我真的很困惑。我是新来的,谢谢。
bvk5enib

bvk5enib1#

如果您感到困惑,没有理由使用LazyInstantiation/LazyInitialization;只需在类init方法中初始化示例变量/属性,不用担心。
由于对象是作为调用getter方法的副作用创建的,因此并不能立即看出它是在创建的,因此另一种方法(也意味着您可以使用默认的编译器生成的getter方法)是在addCard中显式地检查它:

- (void)addCard:(Card *)card
          atTop:(BOOL)atTop
{
    if (!self.cards)
        self.cards = [NSMutableArray new];

    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
    }
}

(and删除用户提供的getter方法)
然而,实际效果与您发布的代码相同,除了self.cards将返回nil,直到调用addCard,但我怀疑这会导致问题。

wh6knrhe

wh6knrhe2#

当使用点标记法访问示例变量时,您是在为给定的属性调用getter方法。因此,通过使用点标记法和惰性示例化,getter将始终在向属性发送消息之前Assert该属性不是nil。因此,诸如

[self.cards insertObject:card atIndex:0];

实际上将调用www.example.com上的getterself.cards;如果您在对象上使用点标记法并相应地编写getter,您将始终确保分配并初始化示例变量,同时清理init方法以获得更重要的代码。
惰性示例化是Objective-C程序员的一种常见做法;我建议你进入会议流程。
编辑:感谢拉斐尔在之前的评论中提到这一点。

kg7wmglp

kg7wmglp3#

延迟示例化在某些类型的方案中是一种性能增强。例如,某个类具有非常昂贵的面向用户的UI字符串。如果您创建该类的许多示例,但在UI中只显示这些示例的一个非常小的子集,则会浪费大量CPU资源来创建一个非常昂贵的、很少使用的UI字符串。

相关问题