memory-management - 我是否通过显式处理 imageView.Image 来赢得内存?

标签 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 有什么关系吗?

最佳答案

Does it immediately release the memory occupied by the previous imageView.Image?

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

调用 Dispose 将删除 managednative UIImage 的引用。如果没有其他( native )引用 UIImage (RetainCount == 0),那么它将被释放(ObjC 引用计数)。

在你的代码中 imageView 仍然有一个对它的引用,直到它的 Image 属性被设置为 newImage - 这就是为什么我回答 不是立即

If it does, is there a cleaner solution?

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

此外,添加局部变量以确保(如果不存在其他 native 引用)图像将立即释放是不值得的(而且无论如何也不会更干净)——它将在下一行发生。

Does this have anything to do with NSAutoreleasePool?

有什么吗?好吧,这两种情况都与内存有关。

创建图像将使用(缓存)当前的 NSAutoreleasePool 并且最终会被耗尽。如果您处理很多东西(例如循环),那么通常值得拥有自己的、短暂的池以确保更快地耗尽。

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

有疑问你最好用Apple Instruments来测量...

关于memory-management - 我是否通过显式处理 imageView.Image 来赢得内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16202692/

相关文章:

iphone - 在 Objective-C 中分配属性

objective-c - 我们可以有多个 NSAutoReleasePool 吗?为什么这是必要的?

ios - Monotouch Google Analytics 应用程序版本

ios - 单击 UICollectionView 中的自定义单元格时如何触发 segue

python - 解包需要长度为 44 的字符串参数 python

java - 从 Java 6 + Tomcat 6 升级到 Java 8 + Tomcat 8 时垃圾收集器的使用

c++ - 在具有多个返回点的函数中进行清理的正确方法

iphone - 覆盖 InputAccessoryView 时未调用模态视图析构函数

Java面试题: finalize() method

用于更快创建新对象的 C++ block 分配器