Tos*_*shi 6 properties objective-c ios
好吧,我只是在应该使用惰性实例化时感到困惑.我理解懒惰实例化的基本概念.
"我理解所有属性在Objective-C中以nil开头,并且向nil发送消息不起作用,因此必须使用[[Class alloc] init]初始化;在向新创建的属性发送消息之前."(Lazy Objective-C/iPhone开发中的实例化)
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];
} }
Run Code Online (Sandbox Code Playgroud)
那么,我真的没有得到的是当我应该使用这种类型的实例化时?大多数情况下,我看到这样的代码:
h.file:
@interface Card : NSObject
@property (strong, nonatomic) NSString *contents;
Run Code Online (Sandbox Code Playgroud)
m.file:
if([card.contents isEqualToString:self.contents]){
score = 1;
}
Run Code Online (Sandbox Code Playgroud)
*这可能是一个愚蠢的问题,但我真的很困惑.我是新来的,谢谢.
如果您发现延迟实例化/延迟初始化令人困惑,则没有理由使用它;只需在类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];
}
}
Run Code Online (Sandbox Code Playgroud)
(并删除用户提供的 getter 方法)
然而,最终效果与您发布的代码相同,除了self.cards
将返回nil
直到addCard
被调用之外,但我怀疑这会导致问题。
归档时间: |
|
查看次数: |
2814 次 |
最近记录: |