通过显式处理imageView.Image来赢取内存吗?

时间:2013-04-24 21:39:53

标签: memory-management xamarin.ios garbage-collection dispose nsautoreleasepool

我在我的应用中有这个代码:

var newImage = // ...

if (imageView.Image != null && imageView.Image != newImage)
    imageView.Image.Dispose ();

imageView.Image = newImage;

我有三个相关的问题:

  • 是否会立即释放上一个imageView.Image所占用的内存?
  • 如果有,是否有更清洁的解决方案?
  • 这是否与NSAutoreleasePool
  • 有关

1 个答案:

答案 0 :(得分:6)

  

是否会立即释放上一个imageView.Image占用的内存?

不是立即但它应该比等待垃圾收集器快得多。

致电Dispose会删除托管原生 UIImage的引用。如果没有别的(本机地)引用UIImage(RetainCount == 0)那么它将被释放(ObjC引用计数)。

在您的代码imageView中,Image属性设置为newImage之前仍然会引用它 - 这就是我回答不立即的原因。< / p>

  

如果有,是否有更清洁的解决方案?

不是真的。让GC做它的工作看起来更干净 - 但是图像可能非常大并且值得尽快释放。

此外,它并不值得(并且不会更干净)添加局部变量以确保(如果不存在其他本机引用)图像将立即释放 - 它将在下一行发生。

  

这与NSAutoreleasePool有关吗?

还有什么?这两种情况都与记忆有关。

创建图像将使用(缓存)当前NSAutoreleasePool,并最终将耗尽。如果你处理很多东西(例如一个循环),那么通常需要拥有你自己的,短命的池来确保更快的消耗。

某些API(众所周知需要大量内存)使用一个属性进行修饰,该属性会自动添加(btouch)NSAutoreleasePool - 但要找出哪个属性并不容易。

有疑问,您最好使用Apple Instruments来衡量......