我正在阅读教程书。当我看到一个例子时,我感到有些困惑。
以下代码显示了延迟加载的方法。实例取消分配后,是否会释放此动机数组?否则它将占用此内存块,直到应用程序终止。
+ (NSArray *)motivations
{
static NSArray *motivations = nil;
if (!motivations)
{
motivations = [[NSArray alloc] initWithObjects:@"Greed",@"Revenge",@"Bloodlust",@"Nihilism",@"Insanity",nil];
}
return motivations;
}
编辑1
感谢Georg的错误。
最佳答案
因为它是静态对象,所以系统将存储对象指针,直到应用程序终止。通过让指针指向不是release
或autorelease
的对象,可以使用这种方式进行缓存。
我建议您在确实要在内存中缓存一些数据(通常是小图像数据或大图像数据)时使用此方法,而这需要大量的CPU或IO处理时间才能生成。对于像NSString这样的小数据,您可以创建新数组并在需要时返回。
编辑评论:
关于imageNamed:
有两件事
1 /您无法控制imageNamed:
缓存的内容和未缓存的内容。例如,您可能不希望缓存大尺寸且仅使用一次的图像。
2 / imageNamed:不能用于从网络或系统中的文件夹获取图像。它只会从您的捆绑包中加载