[[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]相同。好的,没有错误,但没有发布任何内容。
答案 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]
很明显,test
和image
是同一个对象(因此具有相同的retainCount
)。每当你释放其中一个时,该对象就会消失(除非你之前retain
)。
另请注意,retainCount
不您应该依赖或做出很多假设。它往往具有误导性。