在iOS中进行延迟初始化

Lio*_*ion 5 initialization lazy-evaluation ios

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

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

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

  1. 如果没有值NSDictionary,则保持为零.然后,对于此变量的每个后续调用,都会在其中进行搜索NSDictionary.
  2. 复制类(NSCopying协议)的整个实例时,将复制所有变量,从而产生整个转换NSDictionary.

解决方案:

  1. 放置一些表示已检查值的标志.但是你必须添加额外的检查
  2. 仅复制NSDictionary对象实例,但之后必须再次解析相同的变量

无论如何,这些解决方案并非最佳.也许有人面临类似的问题,可以建议其他技术.

Rob*_*ier 3

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

对于复制,我的第一个建议是使该对象成为值(不可变)对象。使用 JSON 对其进行一次初始化,然后不提供任何修改器(这可能是您已经在做的事情)。那么复制就变得微不足道了;就回来吧self。您不需要制作真实的副本,因为所有副本都可以互换。价值对象的最大好处之一是它们的复制成本非常低且容易。

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

  • “除非这是一本真正巨大的字典,否则我不会太担心”,即使如此,假设有一个好的哈希算法,查找仍然应该是 O(1)。当然远不及 O(n) (3认同)