Development Tip

약한 참조 이점

yourdevel 2020. 10. 24. 11:56
반응형

약한 참조 이점


누군가 C #에서 다양한 유형의 참조의 주요 이점을 설명 할 수 있습니까?

  • 약한 참조
  • 소프트 참조
  • 팬텀 참조
  • 강력한 참조.

우리는 많은 메모리를 소비하는 응용 프로그램이 있으며 이것이 집중해야 할 영역인지 확인하려고합니다.


소프트 및 팬텀 참조는 Java에서 나온다고 생각합니다. 긴 weak 참조 (C #의 WeakReference 생성자에 true 전달)는 Java의 PhantomReference와 유사한 것으로 간주 될 수 있습니다. C #에 SoftReference에 대한 아날로그가 있다면 그것이 무엇인지 모르겠습니다.

약한 참조는 개체의 수명을 연장하지 않으므로 모든 강력한 참조가 범위를 벗어나면 가비지 수집 될 수 있습니다. 초기화하는 데 비용이 많이 드는 대형 객체를 보유하는 데 유용 할 수 있지만 실제로 사용하지 않는 경우 가비지 수집에 사용할 수 있어야합니다.

이것이 응용 프로그램의 메모리 소비를 줄이는 데 유용할지 여부는 응용 프로그램의 세부 사항에 따라 완전히 다릅니다. 예를 들어, 나중에 재사용되거나 재사용되지 않을 수있는 캐시 된 객체가 적당히 많이있는 경우 약한 참조는 캐시의 메모리 소비를 개선하는 데 도움이 될 수 있습니다. 그러나 앱이 매우 많은 수의 작은 개체를 사용하는 경우 참조 개체가 더 많은 메모리를 차지하므로 약한 참조는 문제를 더 악화시킵니다.


MSDN에는 약한 참조에 대한 좋은 설명이 있습니다. 주요 인용문은 다음과 같이 하단에 있습니다.

메모리 관리 문제에 대한 자동 솔루션으로 약한 참조를 사용하지 마십시오 . 대신 애플리케이션의 개체를 처리하기위한 효과적인 캐싱 정책을 개발하십시오.

WeakReference를 야생에서 볼 때마다 메모리 관리 문제에 대한 자동 솔루션으로 사용되었습니다. 응용 프로그램의 문제에 대한 더 나은 솔루션이있을 수 있습니다.


WeakReference를 사용한 멋진 실제 예제는 Android 개발 자습서에 설명되어 있습니다 .

뷰 (ImageView)에는 이미지 (Bitmap)와 이미지 컨테이너가 있습니다. 이미지가 메모리에서로드되지 않고 (예 : 디스크, 넷에서)로드되는 경우 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);
            }
        }
    }
}

PS 예제는 Java로되어 있지만 C # 개발자가 이해할 수 있습니다.
출처 : http://developersdev.blogspot.ru/2014/01/weakreference-example.html

참고 URL : https://stackoverflow.com/questions/310685/weak-reference-benefits

반응형