什么是将UIImage分配给内存并将其释放到iphone的正确方法

时间:2010-03-24 11:15:36

标签: iphone memory-leaks uiimageview

使用Instruments,我不断用UIImage指出内存泄漏 我想我正在分配和释放内存。仪器中泄漏的物体被描述为NSConcreteData

以下是分配和发布UIImage的正确方法吗?

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];    
[flagimg release];
flagimg =nil;

3 个答案:

答案 0 :(得分:8)

[UIImage imageWithData:]返回一个自动释放的对象,不应该再次释放。因此,此代码剪切不包含内存泄漏,而是相反,双重释放(在最坏的情况下)。

请注意,乐器有时会在基金会本身产生误报和/或报告内存泄漏(是的,它们也会犯错: - )。

分配/释放对象的最快方法是避免使用便利初始化程序(如imageWithData :),而不是像

那样
NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];

这将立即分配和释放您的对象,而不是等到清理自动释放池。

但是请注意,内存泄漏通常不是尚未释放的内存,但是会丢失并且不能再被释放,所以一个对象是将被自动释放池解除分配不被视为内存泄漏。

答案 1 :(得分:1)

作为一般规则,您可以说

如果您创建了一个对象,其中包含“init”,“copy”或“retain”,则必须将其释放。 如果没有,你得到一个自动释放的对象。

这并非总是如此,但在大多数情况下

答案 2 :(得分:0)

imageWithDatadataWithContentsOfURL都会返回自动释放的对象,因此您应该在该代码段中没有内存泄漏。

由于flagimg已自动退回,因此不需要[flagimg release];来电;你过度释放了那个物体。