-1

我已经将问题缩小到这个:

// newImage is passed from elsewhere
NSLog(@"retain count first : %lu", [newImage retainCount]);
img = newImage;
[imgView setImage:newImage];
NSLog(@"retain count next : %lu", [newImage retainCount]);
[imgView setImage:nil];
NSLog(@"retain count finally : %lu", [newImage retainCount]);

上面的代码产生:

2012-03-17 21:51:04.833 App[67425:507] retain count first : 1
2012-03-17 21:51:04.833 App[67425:507] retain count next : 2
2012-03-17 21:51:04.834 App[67425:507] retain count finally : 4

如果我注释掉这一行[imgView setView:nil],代码会产生:

2012-03-17 21:51:52.314 App[67479:507] retain count first : 1
2012-03-17 21:51:52.314 App[67479:507] retain count next : 2
2012-03-17 21:51:52.314 App[67479:507] retain count finally : 2

所以基本上[imgView setImage:nil]将保留计数增加2,什么时候应该减少1?!

4

1 回答 1

3

不要依赖-retainCount 真的,不要。 真的。

可能imgView保留并自动发布您的图像。保留计数现在更高,但在您的函数返回后自动释放执行其释放时会减少。(很可能在当前运行循环迭代结束时。)

如果您真的想知道发生了什么,请使用分配工具。打开“记录引用计数”,点击特定对象,您可以看到在该对象上调用的每个内存管理相关函数(分配、保留、释放、自动释放和释放)。远比看有用retainCount

于 2012-03-18T02:03:33.580 回答