我只是不明白什么时候应该使用惰性示例化。不过我理解惰性示例化的基本概念。
“我知道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;
}
- 这可能是一个愚蠢的问题,但我真的很困惑。我是新来的,谢谢。
3条答案
按热度按时间bvk5enib1#
如果您感到困惑,没有理由使用LazyInstantiation/LazyInitialization;只需在类
init
方法中初始化示例变量/属性,不用担心。由于对象是作为调用getter方法的副作用创建的,因此并不能立即看出它是在创建的,因此另一种方法(也意味着您可以使用默认的编译器生成的getter方法)是在
addCard
中显式地检查它:(and删除用户提供的getter方法)
然而,实际效果与您发布的代码相同,除了
self.cards
将返回nil
,直到调用addCard
,但我怀疑这会导致问题。wh6knrhe2#
当使用点标记法访问示例变量时,您是在为给定的属性调用getter方法。因此,通过使用点标记法和惰性示例化,getter将始终在向属性发送消息之前Assert该属性不是nil。因此,诸如
实际上将调用www.example.com上的getterself.cards;如果您在对象上使用点标记法并相应地编写getter,您将始终确保分配并初始化示例变量,同时清理init方法以获得更重要的代码。
惰性示例化是Objective-C程序员的一种常见做法;我建议你进入会议流程。
编辑:感谢拉斐尔在之前的评论中提到这一点。
kg7wmglp3#
延迟示例化在某些类型的方案中是一种性能增强。例如,某个类具有非常昂贵的面向用户的UI字符串。如果您创建该类的许多示例,但在UI中只显示这些示例的一个非常小的子集,则会浪费大量CPU资源来创建一个非常昂贵的、很少使用的UI字符串。