关于延迟加载的内存

时间:2010-09-15 02:12:21

标签: iphone objective-c cocoa macos

我正在阅读教程书。当我看到一个例子时,我感到困惑。 以下代码显示了延迟加载的方法。实例解除分配后,是否会释放此动机数组?或者它会占用这个内存块,直到应用程序终止。

+ (NSArray *)motivations
{
    static NSArray *motivations = nil;
    if (!motivations)
    {
        motivations = [[NSArray alloc] initWithObjects:@"Greed",@"Revenge",@"Bloodlust",@"Nihilism",@"Insanity",nil];

    }
    return motivations;
}

编辑1    感谢Georg的错误。

3 个答案:

答案 0 :(得分:3)

您显示的示例有一个错误 - +arrayWithObjects:返回一个自动释放的实例,稍后将销毁该实例。代码可能是:

motivations = [[NSArray alloc] initWithObjects:@"Greed",@"Revenge",@"Bloodlust",@"Nihilism",@"Insanity",nil];

这样,数组将一直存在,直到应用程序终止。

答案 1 :(得分:2)

因为它是一个静态对象,所以系统将存储对象指针,直到应用程序终止。您可以使用这种方式缓存,只需让指针指向不是releaseautorelease的对象

我建议您在真正想要在内存中缓存一些数据时使用这种方法(通常是小图像数据或大图像数据),这需要大量的CPU或IO处理时间来生成。对于像NSString这样的小数据,您可以创建新数组并在每次需要时返回。

修改评论 imageNamed:

有两件事

1 /您无法控制imageNamed:缓存的内容和未缓存的内容。例如,您可能不想缓存大尺寸的图像,只使用一次。

2 / imageNamed:不能用于从网络或系统中的文件夹中获取图像。它只会从您的包中加载

答案 2 :(得分:1)

由于这是一个类方法(在声明中用+而不是 - 表示),因此没有将要发布的实例。 (从技术上讲,我认为有一个类对象的实例(?如果我错了请注意,我不太了解内部工作原理)但不要担心这一点)

因此,在程序运行的整个时间内存在于内存中的类拥有该数组。将静态视为尽可能接近类变量,而不是实例变量。由于该类始终存在,因此数组一直存在。

延迟加载使得它不会被创建,直到第一次调用类方法为止,因此在您需要它之前不会浪费内存。