Sco*_*sen 61
我相信,软和虚幻的引用来自Java.一个很长的弱引用(传递给C#的WeakReference构造函数)可能被认为类似于Java的PhantomReference.如果在C#中存在与SoftReference类似的模拟,我不知道它是什么.
弱引用不会延长对象的生命周期,因此一旦所有强引用都超出范围,就允许对其进行垃圾回收.它们可用于保留初始化成本昂贵的大对象,但如果它们没有被主动使用,则应该可用于垃圾收集.
这是否有助于减少应用程序的内存消耗将完全取决于应用程序的细节.例如,如果您有可能会或可能不会在将来重复使用的中等数量的缓存对象,则弱引用可能有助于提高缓存的内存消耗.但是,如果应用程序正在处理大量小对象,则弱引用会使问题变得更糟,因为引用对象将占用尽可能多的内存.
Mus*_*sis 35
MSDN对弱引用有很好的解释.关键的报价在底部,它说:
避免使用弱引用作为 内存 管理问题的自动解决方案.相反,开发一个有效的缓存策略来处理应用程序的对象.
每当我在野外看到WeakReference时,它就被用作内存管理问题的自动解决方案.对于您的应用程序的问题,可能有更好的解决方案.
Android开发教程中解释了WeakReference的精彩实例.
视图(ImageView)上有一个图像(位图)和图像容器.如果图像不是从内存加载(但例如从磁盘,网络),那么它可以锁定UI线程和屏幕.为避免这种情况,可以使用异步任务.
异步任务完成时会出现问题.图像容器在那时根本没用(屏幕被更改或Android在滚动后卸载不可见的视图部分).WeakReference可以在这里提供帮助,ImageView将被垃圾收集.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
PS示例是在Java中,但C#开发人员可以理解.
资料来源:http://developersdev.blogspot.ru/2014/01/weakreference-example.html