嗯,我应该在使用惰性实例化时感到困惑。 我理解懒惰实例化的基本概念。
“我理解所有属性在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;
}
*这可能是一个愚蠢的问题,但我真的很困惑。我是新来的,谢谢。
答案 0 :(得分:2)
如果您发现混淆,则没有理由使用Lazy Instantiation / Lazy Initialization;只需在类init
方法中初始化您的实例变量/属性,不要担心它。
由于对象是作为调用getter方法的副作用而创建的,所以它根本不是显而易见的,所以一种替代方法,这也意味着你可以使用默认的compiler-generate 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
,但我怀疑这会导致问题
答案 1 :(得分:1)
使用点表示法访问实例变量时,您将为该给定属性调用getter方法。因此,通过使用点表示法和延迟实例化,在发送消息之前,getter将始终断言属性不是nil。因此,代码如
[self.cards insertObject:card atIndex:0];
实际上会在self.cards上调用getter;如果你在对象上使用点符号并相应地编程getter,你将始终确保分配和初始化你的实例变量,同时清理你的init方法以获得更重要的代码。
懒惰实例化是Objective-C程序员的常见做法;我建议进入大会的流程。
编辑:感谢Raphael先前在评论中提到这一点。