在iOS中进行延迟初始化

时间:2014-01-23 16:17:19

标签: ios initialization lazy-evaluation

数据来自JSON中的服务器,它位于NSDictionary中。根据所请求数据的类型,将从此NSDictionary创建新的类对象。有大量数据出现,因此该对象包含对NSDictionary的引用,并仅在引用特定变量时提取值。像延迟初始化的东西:

- (NSString *)imgURL {
    if (_imgURL == nil) {
        _imgURL = [self makeObjForKey:kImageURL];
    }
    return _imgURL;
}

这显着提高了应用程序的速度,但会产生其他问题:

  1. 如果NSDictionary中没有值,则保持为零。然后,对于此变量的每次后续调用,都会在NSDictionary中搜索它。
  2. 复制整个类的实例(NSCopying协议)时,会复制所有变量,从整个NSDictionary生成转换。
  3. 解决方案:

    1. 放置一些标志,表明已检查过该值。但是你呢 必须添加额外的支票
    2. 仅复制NSDictionary对象实例,但之后必须复制 再次解析相同的变量
    3. 无论如何,这些解决方案并非最佳。也许有人面临类似的问题,可以建议其他技术。

1 个答案:

答案 0 :(得分:3)

NSDictionary查找速度非常快。除非这是一个真正庞大的字典,否则我不会过多担心查找。如果您有一些特别经常检查的属性,那么您可以使用特殊标志来优化它们,但我通常不会担心它。

对于复制,我的第一个建议是使这个对象成为一个值(不可变)对象。用JSON初始化它一次,然后不提供任何mutators(这可能就是你已经在做的)。然后复制是微不足道的;只需返回self。您不需要制作真正的副本,因为所有副本都是可互换的。价值对象的一大好处是它们的复制价格便宜且容易。

如果您有时确实需要可变版本,请遵循NSArray / NSMutableArray模式。然后只有可变版本才能处理副本(在这种情况下你应该只复制字典;而不是复制的对象)。

相关问题