3

[[UIImage alloc] initWithContentsOfFile:path]

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

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];

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

4

2 回答 2

1

此示例中的保留计数与图像是否为 nil 无关。您使用手动分配图像

UIImage* test = [UIImage alloc];

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

有关该主题的更多信息,请参阅内存管理规则

于 2011-07-05T10:00:30.860 回答
0

releaseonnil是无操作的,所以总是好的。而且它不会泄漏,因为你没有一个对象可以开始。

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您应该依赖或做出太多假设的东西。它往往充其量是误导。

于 2011-07-05T10:07:54.540 回答