我在我的应用中有这个代码:
var newImage = // ...
if (imageView.Image != null && imageView.Image != newImage)
imageView.Image.Dispose ();
imageView.Image = newImage;
我有三个相关的问题:
imageView.Image
所占用的内存?NSAutoreleasePool
?答案 0 :(得分:6)
是否会立即释放上一个imageView.Image占用的内存?
不是立即但它应该比等待垃圾收集器快得多。
致电Dispose
会删除托管对原生 UIImage
的引用。如果没有别的(本机地)引用UIImage
(RetainCount == 0)那么它将被释放(ObjC引用计数)。
在您的代码imageView
中,Image
属性设置为newImage
之前仍然会引用它 - 这就是我回答不立即的原因。< / p>
如果有,是否有更清洁的解决方案?
不是真的。让GC做它的工作看起来更干净 - 但是图像可能非常大并且值得尽快释放。
此外,它并不值得(并且不会更干净)添加局部变量以确保(如果不存在其他本机引用)图像将立即释放 - 它将在下一行发生。
这与NSAutoreleasePool有关吗?
还有什么?这两种情况都与记忆有关。
创建图像将使用(缓存)当前NSAutoreleasePool
,并最终将耗尽。如果你处理很多东西(例如一个循环),那么通常需要拥有你自己的,短命的池来确保更快的消耗。
某些API(众所周知需要大量内存)使用一个属性进行修饰,该属性会自动添加(btouch)NSAutoreleasePool
- 但要找出哪个属性并不容易。
有疑问,您最好使用Apple Instruments来衡量......