使用Instruments,我不断用UIImage指出内存泄漏 我想我正在分配和释放内存。仪器中泄漏的物体被描述为NSConcreteData
以下是分配和发布UIImage的正确方法吗?
UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];
[flagimg release];
flagimg =nil;
答案 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)
imageWithData
和dataWithContentsOfURL
都会返回自动释放的对象,因此您应该在该代码段中没有内存泄漏。
由于flagimg
已自动退回,因此不需要[flagimg release];
来电;你过度释放了那个物体。