多次读取 plist 与创建对象并仅读取 plist 一次以访问 plist 中的数据
Posted
技术标签:
【中文标题】多次读取 plist 与创建对象并仅读取 plist 一次以访问 plist 中的数据【英文标题】:Reading plist many times vs. Creating object and read plist only once to access data in plist 【发布时间】:2011-07-08 06:40:49 【问题描述】:我想创建一个从 plist 检索数据的数据管理器类,我想知道是否应该创建一个包含所有类方法的类,每次调用该方法并返回请求的值时读取 plist,或者创建一个类使用 plist 数据初始化数组(实例变量)的初始化程序,所有方法都是从数组中获取数据的实例方法。
我想知道哪个更昂贵:多次读取 plist(比如 50 次)或实例化一个对象,或者只是哪个更好。
提前感谢您的帮助。
【问题讨论】:
“阅读 NSBundle”没有意义。您的意思是阅读 plist 吗? 【参考方案1】:这是编程中的经典权衡之一 - 速度与内存使用。一次读取某些内容并将其存储在更快的介质(在此示例中,在内存中)的技术称为缓存。它非常受欢迎,而且有充分的理由。大容量存储设备仍然比 RAM 慢几个数量级,网络访问比本地大容量存储慢几个数量级。
如果您假设数据会经常被询问经理,并且如果您假设 plist 不会更改(或者您可以检测到更改),那么在第一次访问 getter 时读取 plist,将其存储在iVar,只要 plist 没有改变,就只回答 iVar。这会使用更多内存,但对于后续访问来说要快得多。
注意:这种方法对非常非常大的文件有害。如果您担心内存使用情况,请在您的视图控制器中实现- (void)didReceiveMemoryWarning
方法,并在内存不足时刷新缓存(删除)。
getter 方法可能如下所示:
- (NSArray *)data
if (!cacheArray)
//what we do now is called "lazy initialization": we initialize our array only when we first need the data.
//This is elegant, because it ensures the data will always be there when you ask for it,
//but we don't need to initialize for data that might never be needed, and we automatically re-fill the array in case it has been deleted (for instance because of low memory)
cacheArray = ... //read array from plist here; be sure to retain or copy it
return cacheArray;
【讨论】:
@Peter Hosey 感谢您的编辑。不过,我真的不明白你所说的“方法的正确实现”是什么意思。我是否忽略了原始实现的问题? 我最好的猜测是@Peter 有一个只有一个返回点的东西。另外,您在分配数组后忽略了返回数组。 我不关心单点退货(我实际上使用提前退货没有问题),尽管当多次退货没有任何改善时我更喜欢它。我唯一的问题是最后缺少回报。我借此机会解决了这个问题,通过单次返回进行了简化,并在一次编辑中添加了关于保留的注释。 哦,对了,最后的回报。是的,我确实忘记了这一点。真丢人!尽管如此,我还是喜欢提前返回,因为它们让读者非常清楚在什么情况下方法不会被进一步执行。 @Peter 感谢您的解释,并感谢您的修复。而对于咆哮。以上是关于多次读取 plist 与创建对象并仅读取 plist 一次以访问 plist 中的数据的主要内容,如果未能解决你的问题,请参考以下文章
从 plist 读取,然后将对象保存到不同的 plist iOS