NSCache、NSDictionary、NSArray对比

NSCache、NSDictionary、NSArray

1.NSArray 作为一个存储对象的有序集合,可能使用最多的集合类

性能特征:
在数组的开头和结尾插入删除通常是直接操作O(1),而随机的插入和删除通常是O(n)
2.NSDictionary中的键是被拷贝的并且需要是恒定的,如果在一个键在被用于字典中放入一个值后被改变,那么这个值可能就会变得无法获取了。一个有趣的细节,在NSDictionary中键是被拷贝的,而在使用一个tool-free桥接的CFDictionary时却是被retain。CoreFoundation类没有通用对象的拷贝方法,因此这时拷贝是不可能的(*),这只是用于使用CFDictionarySetValue()的时候,如果通过setObject:forKey使用toll-free桥接的CFDictionary,苹果增加了额外处理逻辑来使键被拷贝。反过来这个结论则不成立 — 转换为CFDictionary的NSDictionary对象,对其使用CFDictionarySetValue()方法会调用回setObject:forKey并拷贝键。

  1. NSCache
    NSCache是一个非常奇怪的集合。在iOS 4/Snow Leopard中加入,默认为可变并且线程安全的。这使它很适合缓存那些创建起来代价高昂的对象。它自动对内存警告做出反应并基于可设置的成本清理自己。与NSDictionary相比,键是被retain而不是被拷贝的。

  2. iOS 构建缓存时选 NSCache 而非NSDictionary
    原因:

当系统资源将要耗尽时,NSCache可以自动删减缓存。如果采用普通的字典,那么就要自己编>写挂钩,在系统通知时手动删减缓存,NSCache会先行删减 时间最久为被使用的对象
NSCache 并不会拷贝键,而是会保留它。此行为用NSDictionary也可以实现,但是需要编写比较复杂的代码。NSCache对象不拷贝键的原因在于,很多时候键都是不支持拷贝操作的对象来充当的。因此NSCache对象不会自动拷贝键,所以在键不支持拷贝操作的情况下,该类比字典用起来更方便

NScache是线程安全的,NSDictionary不是。在开发者自己不编写加锁代码的前提下,多个线程可以同时访问NSCache。对缓存来说,线程安全通常是很重要的,因为开发者可能在某个线程中读取数据,此时如果发现缓存里找不着指定的键,那么就要下载该键对应的数据了

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页