使用NSDictionary valueForKey查找对象与通过NSArray进行迭代

时间:2013-02-18 21:25:27

标签: ios objective-c performance cocoa nsarray

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

选项1:

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

选项2:

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

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

3 个答案:

答案 0 :(得分:7)

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

来自CFDictionary.h

  

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

答案 1 :(得分:5)

  

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

是。

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

更具可读性。

(哦,你的意思是表现?不要担心。过早的优化是几乎所有邪恶的根源。)

答案 2 :(得分:1)

就像H2CO3所说,我选择选项2以便于阅读。

但是,如果它真的是一个缓存(即如果内存紧张,你很高兴操作系统自动从缓存中删除对象),我会使用NSCache而不是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"];