2010-03-24 39 views

回答

8

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

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

到页头的最快方法/释放的目的是避免方便初始化(如imageWithData :),而是以类似

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

这将分配和释放你的对象的时候了,而不是等到autorelease池被清理。

但请注意一点,就是内存泄漏通常不是内存,是不是尚未中解脱出来,但丢失,不能再释放,所以这将是由自动释放池被释放的对象不考虑了内存泄漏。

+0

什么是“双释放”的结果? – dubbeat 2010-03-24 11:39:30

+0

通常会导致程序崩溃的EXC_BAD_ACCESS(通常称为段错误)。如果您有一个已经释放的对象并尝试访问它,那么也会发生这种情况。 – Alfonso 2010-03-24 11:48:11

0

两个imageWithDatadataWithContentsOfURL返回自动释放的对象,所以你应该在那些代码段没有内存泄漏。

由于flagimg返回自动发布,您的[flagimg release];调用不需要;你过度释放该对象。

1

作为一般规则,你可以说

,如果你创建一个对象的一个​​孤单“初始化”,“复制”或为“保留”,你必须将其释放。如果不是,你会得到一个autoreleased对象。

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

相关问题