通常,我使用静态数组和字典在我的类中包含查找表。然而,随着类的数量迅速蔓延到数百个,我对于继续使用这种模式犹豫不决。即使这些静态集合被懒惰地初始化,我也基本上在有人使用我的应用程序时发生了有限的内存泄漏。
大多数是字符串数组,所以我可以将字符串转换为可以与switch语句一起使用的NSInteger常量等。
我可以在每次调用时重新创建数组/字典,但是很多这些函数都被大量使用和/或用于紧密循环。
所以我试图想出一个兼容并且不持久的模式。
如果我将信息存储在plist中,那么iphoneOS是否可以做任何有关加载时缓存的信息?
您是否有其他可能相关的方法?
编辑 - 答案示例
基于下面提出的解决方案,以下是我将要使用的内容......
首先,通过类别向NSObject添加方法。
- (void)autoreleaseOnLowMemory;
现在,每当我想在辅助函数中创建延迟加载静态数组或字典时,我只能使用以下模式......
- (id)someHelperFunction:(id)lookupKey {
static NSDictionary *someLookupDictionary = nil;
if (!someLookupDictionary) {
someLookupDictionary = [[NSDictionary dictionaryWithObjects:X, Y, Z, nil] autoreleaseOnLowMemory];
}
return [someLookupDictionary objectForKey:lookupKey];
}
现在,代替那个静态字典,直到程序结束,如果我们的内存不足,它将被释放,并且只在需要时重新实例化。是的,在iphone上运行的大型项目中,这很重要!
PS - autoreleaseOnLowMemory的实现是微不足道的。只需使用一个方法创建一个单例类,该方法接受一个对象并将其保留在一个集合中。让那个单例监听低内存警告,如果有一个,则释放该集合中的所有对象。可能还想添加手动释放功能。
答案 0 :(得分:2)
我通常更喜欢plist,因为它们易于在代码的不同部分维护和重用。如果从文件加载到NSDictionary中的速度是一个问题(并检查分析器是否确定),您可以始终将它们放入一个实例变量中,当您收到内存警告时可以释放它。
答案 1 :(得分:0)
如果你只是在做字符串,你可以使用C数组。
id keys[] = { @"a" , @"b" , @"c" };
id values[] = { @"1" , @"2" , @"3" };
如果您偶尔需要一个真正的NSArray或NSDictionary:
[NSArray arrayWithObjects:values count:3];
[NSDictionary dictionaryWithObjects:values forKeys:keys count:3];
plist将涉及每个集合的磁盘命中和xml解析。据我所知,只有NSUserDefaults被缓存。