如何管理静态,延迟加载的字典和数组的内存负载

时间:2010-05-13 23:06:59

标签: iphone objective-c cocoa cocoa-touch plist

通常,我使用静态数组和字典在我的类中包含查找表。然而,随着类的数量迅速蔓延到数百个,我对于继续使用这种模式犹豫不决。即使这些静态集合被懒惰地初始化,我也基本上在有人使用我的应用程序时发生了有限的内存泄漏。

大多数是字符串数组,所以我可以将字符串转换为可以与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的实现是微不足道的。只需使用一个方法创建一个单例类,该方法接受一个对象并将其保留在一个集合中。让那个单例监听低内存警告,如果有一个,则释放该集合中的所有对象。可能还想添加手动释放功能。

2 个答案:

答案 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被缓存。