initWithContentsOfFile:path]内存管理,返回nil

时间:2011-07-05 09:55:20

标签: iphone uiimage release alloc

[[UIImage alloc] initWithContentsOfFile:path]

当方法无法初始化图像时返回nil。然后下一个代码没有释放分配的UIImage,因为[image release]行中的图像为零:

UIImage* image = [[UIImage alloc] initWithContentsOfFile:path];
if(image)
{
....
}
//Here image is nil and not releases allocated UIImage.
[image release];

这真的是内存泄漏吗?

如果init返回nil,如何释放对象? 如果我做 UIImage * image = [[UIImage alloc] initWithContentsOfFile:path];

并且图像为零,因为init失败, [image release]与[nil release]相同。好的,没有错误,但没有发布任何内容。

2 个答案:

答案 0 :(得分:1)

此示例中的保留计数与图像是否为零无关。您使用

手动分配了图像
UIImage* test = [UIImage alloc];

因此,在您手动释放它之前,保留计数将为1,因为您是该对象的唯一所有者。

有关此主题的详情,请参阅Memory Management Rules

答案 1 :(得分:1)

release上的{p> nil是无操作,所以一直都好。并且它不会泄漏,因为你没有开始的对象。

UIImage* test = [UIImage alloc];

test本身已经是UIImage个对象(虽然您未能在此行初始化它)。

你真的总是在同一行(和同一个变量)上执行alloc / init - 或者代码逻辑真的很难理解。您的代码只生成一个对象,然后将其分配给另一个变量。

这是相同的,但更清楚:

UIImage* test = [[UIImage alloc] initWithContentsOfFile:path];
UIImage* image = test;
int n = [test retainCount]

很明显,testimage是同一个对象(因此具有相同的retainCount)。每当你释放其中一个时,该对象就会消失(除非你之前retain)。

另请注意,retainCount 您应该依赖或做出很多假设。它往往具有误导性。