代码之家  ›  专栏  ›  技术社区  ›  AechoLiu

关于延迟加载的内存

  •  1
  • AechoLiu  · 技术社区  · 14 年前

    我现在正在读辅导书。当我看到一个例子时,我有些困惑。 下面的代码显示了一种延迟加载的方法。在释放实例后是否释放此数组?或者它会占用这个内存块直到应用程序终止。

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

    编辑1

    3 回复  |  直到 14 年前
        1
  •  2
  •   vodkhang    14 年前

    因为它是静态对象,所以系统将存储对象指针,直到应用程序终止。通过让指针指向一个不存在的对象,可以使用这种方法来缓存 release autorelease

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

    编辑评论: 有两件事 imageNamed:

    1/您无法控制缓存的内容和未缓存的内容 . 例如,您可能不希望缓存大小较大且只使用一次的图像。

    2/imageNamed:不能用于从网络或系统中的文件夹获取图像。它只能从你的包裹里装

        2
  •  3
  •   Georg Fritzsche    14 年前

    +arrayWithObjects:

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

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

        3
  •  1
  •   Alex Gosselin    14 年前

    因为这是一个类方法(在声明中用+而不是-表示),所以不会释放任何实例。(从技术上讲,我认为有一个isa类对象的实例(?)?评论如果我错了,请,我不知道内部工作非常好)但不要担心)

    因此,在程序运行期间一直存在于内存中的类拥有该数组。把static看作是尽可能接近类变量,而不是实例变量。因为类一直存在,所以数组一直存在。

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