gpt4 book ai didi

ios - 延迟实例化

转载 作者:可可西里 更新时间:2023-11-01 03:57:03 25 4
gpt4 key购买 nike

好吧,我只是对何时应该使用惰性实例化感到困惑。不过,我了解惰性实例化的基本概念。

"我知道在 Objective-C 中所有属性都是从 nil 开始的,并且向 nil 发送消息没有任何作用,因此您必须使用 [[Class alloc] init]; 进行初始化,然后再向新创建的属性发送消息。 "( Lazy instantiation in Objective-C/ iPhone development )

m.文件:

@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.文件:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;

m.文件:

 if([card.contents isEqualToString:self.contents]){
score = 1;
}

*这可能是一个愚蠢的问题,但我真的很困惑。我是新来的,谢谢。

最佳答案

如果您发现它令人困惑,则没有理由使用延迟实例化/延迟初始化;只需在类 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];
}
}

(并删除用户提供的 getter 方法)

但是净效果与您发布的代码相同,除了 self.cards 将返回 nil 直到 addCard被调用,但我怀疑这会导致问题。

关于ios - 延迟实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20770622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com