2

我正在为一些图像开发一个简单的 iOS 缓存系统。我需要跟踪 UIImage 本身及其标识符。现在,我试图找出访问正确缓存图像的更快/更有效的方法。

选项1:

for (CachedImage* image in [cachedImageArray]
{
  if ([[image identifier] isEqualToString:@"id_12345"]
  { 
    // use that image
  }
}

选项 2:

UIImage* imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"

使用一种方法或另一种方法有什么好处吗?如果是这样,它是不可忽略的吗?谢谢。

4

3 回答 3

7

字典很可能会更快,因为它们会使用一些散列算法来提高检索效率(通常O(1)而不是O(n))。如果缓存中的元素数量很大,这将是不可忽略的。

来自CFDictionary.h

计算复杂性
对于任何当前和未来的实现,字典中值的访问时间保证在最坏的情况下为 O(lg N),但通常为 O(1)(恒定时间)。插入或删除操作通常也是常数时间,但在某些实现中最坏的情况是 O(N*lg N)。通过键访问值比直接访问值更快(如果有任何此类操作)。与具有相同数量值的数组相比,字典往往会使用更多的内存。

于 2013-02-18T21:28:05.680 回答
5

使用一种方法或另一种方法有什么好处吗?

是的。

UIImage *imageToRetrieve = [cachedImagesDictionary objectForKey:@"id_12345"];

更具可读性

(哦,你是说性能?别担心。过早的优化几乎是万恶之源。)

于 2013-02-18T21:28:18.457 回答
1

就像 H2CO3 所说,我会选择选项 2 以提高可读性。

但是,如果它真的是一个缓存(即,如果内存紧张,您很高兴操作系统会自动从缓存中删除对象),我会使用NSCacheover NSDictionary

// Setup the cache
UIImage *myImage = [UIImage imageNamed:@"blah"];
NSCache *imageCache = [[NSCache alloc] init];
[imageCache setObject:myImage forKey:@"id_12345"];   

// Sometime later...
UIImage* imageToRetrieve = [imageCache objectForKey:@"id_12345"];
于 2013-02-18T21:36:58.760 回答