我已将问题缩小到这个范围:
// 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?!
答案 0 :(得分:3)
Don't rely on -retainCount
. Really, don't. Really.
可能imgView
保留并自动释放您的图片。保留计数现在更高,但在函数返回后自动释放执行释放时将减少。 (很可能是在当前运行循环迭代结束时。)
如果您真的想知道发生了什么,请使用分配工具。打开“记录引用计数”,单击查看特定对象,您可以看到在对象上调用的每个与内存管理相关的函数(分配,保留,释放,自动释放和空闲)。它比观看retainCount
更有用。