1

我遇到了这段代码

UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame];
[image setImage:[UIImage imageNamed:@"myImage"]];
[self.view addSubview:image];
image = nil;

鉴于没有使用 ARC,我假设它会导致image对象上的内存泄漏。然而,静态分析器并没有捕捉到这一点。

我想知道谁错了,是静态分析器还是我,我想对此提出第二意见。

上面的代码真的泄漏了吗?

4

2 回答 2

1

原来误会的是我(呃!)

我正在审核的应用程序非常大,我错过了开发人员使用-fobjc-arc特定类上的标志启用 ARC 的事实,包括上述片段的来源。

静态分析仪万岁!

于 2013-06-24T10:00:06.383 回答
0

self.view有一个指向其子视图的指针数组,这些指针将使您保持image可访问性并将引用计数器(用于 ARC)保持在 0 以上。

CGRect imageFrame = CGRectMake(100, 100, 100, 200);
UIImageView *image = [[UIImageView alloc] initWithFrame:imageFrame];
NSLog(@"image=%@", image);
[image setImage:[UIImage imageNamed:@"Default"]];
[self.view addSubview:image];
image = nil;

UIView *v = [[self.view subviews] objectAtIndex:0];
NSLog(@"v=%@", v);

当您放置self.view = nil;参考计数器时,image将下降并且内存将被释放。我认为您不能以这种方式制造泄漏:)

于 2013-06-24T09:57:37.390 回答