【问题标题】:Lazy instantiation惰性实例化
【发布时间】:2013-12-25 08:20:02
【问题描述】:

我只是对应该使用惰性实例化感到困惑。 不过我理解惰性实例化的基本概念。

" 我知道在 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.文件:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;

m.file:

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

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

【问题讨论】:

  • 延迟安装 = 延迟初始化?
  • 这是惰性实例化!

标签: ios objective-c properties


【解决方案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,但我怀疑这会导致问题。

【讨论】:

  • 非常感谢!我明白了!
  • addCard:atTop: 在使用self.cards 时调用getter,所以当然_cards 是在调用addCard:atTop: 时创建的。
【解决方案2】:

当使用点表示法访问您的实例变量时,您正在为该给定属性调用您的 getter 方法。因此,通过使用点表示法和惰性实例化,您的 getter 将始终在您向其发送消息之前断言属性不是 nil。因此,代码如

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

实际上会调用 self.cards 的 getter;如果您在对象上使用点表示法并相应地对 getter 进行编程,您将始终确保分配和初始化您的实例变量,同时为更重要的代码清理 init 方法。

延迟实例化是 Objective-C 程序员的常见做法;我建议进入大会的流程。

编辑:感谢 Raphael 在之前的评论中提到这一点。

【讨论】:

  • 为什么只有点符号?
  • 这很晚了;无论如何,使用下划线表示法将直接访问对象的内存并允许您以这种方式创造机会;另一方面,点表示法将改为访问 getter 和 setter 方法,允许您在每次使用表示法时运行代码(即确保有问题的 ivar 不是 nil(如果是则设置它),并制作确保有人尝试为给定 ivar 设置的任何内容都是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2012-01-19
相关资源
最近更新 更多