使用仪器,我一直在使用UIImage指出内存泄漏。
我想我正确地分配和释放内存。仪器中泄漏的物体被描述为NSConcreteData什么是正确的方式来分配一个UIImage到内存并释放它iphone
以下是分配和释放UIImage的正确方法吗?
UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];
[flagimg release];
flagimg =nil;
使用仪器,我一直在使用UIImage指出内存泄漏。
我想我正确地分配和释放内存。仪器中泄漏的物体被描述为NSConcreteData什么是正确的方式来分配一个UIImage到内存并释放它iphone
以下是分配和释放UIImage的正确方法吗?
UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];
[flagimg release];
flagimg =nil;
[UIImage imageWithData:]
返回一个自动释放的对象,不应该再次释放您的对象。因此,这段代码被剪掉的内容不是内存泄漏,而是相反的,是双重释放(在最坏的情况下)。
请注意,乐器有时会在基金会本身产生误报和/或报告内存泄漏(是的,他们也犯了错误:-)。
到页头的最快方法/释放的目的是避免方便初始化(如imageWithData :),而是以类似
NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];
这将分配和释放你的对象的时候了,而不是等到autorelease池被清理。
但请注意一点,就是内存泄漏通常不是内存,是不是尚未中解脱出来,但丢失,不能再释放,所以这将是由自动释放池被释放的对象不考虑了内存泄漏。
两个imageWithData
和dataWithContentsOfURL
返回自动释放的对象,所以你应该在那些代码段没有内存泄漏。
由于flagimg
返回自动发布,您的[flagimg release];
调用不需要;你过度释放该对象。
作为一般规则,你可以说
,如果你创建一个对象的一个孤单“初始化”,“复制”或为“保留”,你必须将其释放。如果不是,你会得到一个autoreleased对象。
这并不总是如此,但在大多数情况下,
什么是“双释放”的结果? – dubbeat 2010-03-24 11:39:30
通常会导致程序崩溃的EXC_BAD_ACCESS(通常称为段错误)。如果您有一个已经释放的对象并尝试访问它,那么也会发生这种情况。 – Alfonso 2010-03-24 11:48:11