代码之家  ›  专栏  ›  技术社区  ›  scubasteve

防止访问释放的引用

  •  3
  • scubasteve  · 技术社区  · 14 年前

    我有一个类似于PICTIOBox控件的图像显示控件,它需要一个位图并显示它。问题是,我的控件将天真地尝试执行要求它访问其图像字段的操作,即使提供的位图已被释放。所以假设我有一个窗体,上面有我的图像显示控件。我已经将Image属性设置为从文件加载的图像,然后出于某种原因(无论为什么或如何)释放该图像。然后我做了一些事情来重新绘制图像控件,当它试图访问位图(现在已处理)时,它会左右抛出InvalidArgumentException。我理解这个问题,但对解决方案没有100%的信心。

    我的图像显示控件无法控制图像引用是否被调用代码释放,并且我知道没有公共方法来检查对象是否被释放。我可以想到两种可能的解决方案:

    1. 将位图的副本存储在我的图像控件中(即clone()所提供的图像),然后对源图像进行什么操作都无关紧要。我认为这是最好的解决办法。
    2. 在try/catch语句中包含我能想到的所有内容——这是一个糟糕的选择,我只是为了阻止其他人提出建议。

    在我实施选项1(我认为最有意义的选项)之前,我认为我会在这里询问,以防出现处理这种情况的最佳实践。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Aliostad    14 年前

    当我在C和Winforms中开发ImageViewer控件时,我遇到了同样的难题。事实上,处理图像的责任由控制的客户承担,而另一方面,不及时处理的错误将导致控制崩溃,这是不可接受的。

    我使用了第一种方法——保存位图的本地/内部副本——除了内存使用,它没有任何缺点。我相信这是更好的方法。

        2
  •  0
  •   MrFox    14 年前

    如果要更改位图上的任何像素,则应始终克隆该像素并更改克隆的版本。

    除此之外,你的解决方案可能是相当好的。