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