문제

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

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

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

도움이 되었습니까?

해결책

부드럽고 유령 참조는 Java에서 나옵니다. 긴 약한 기준 (C#의 약한 회의 생성자에게 충실 함)은 Java의 Phantomreference와 유사하게 간주 될 수 있습니다. C#에 Softreference와 아날로그가 있다면 그것이 무엇인지 모르겠습니다.

약한 참조는 물체의 수명을 연장하지 않으므로 모든 강한 참조가 범위를 벗어나면 쓰레기를 수집 할 수 있습니다. 초기화 비용이 많이 드는 큰 물체를 잡는 데 유용 할 수 있지만 적극적으로 사용하지 않으면 쓰레기 수집에 사용할 수 있어야합니다.

이것이 응용 프로그램의 메모리 소비를 줄이는 데 유용한 지 여부는 애플리케이션의 세부 사항에 전적으로 의존합니다. 예를 들어, 미래에 재사용 될 수도 있고 재사용되지 않을 수도있는 캐시 된 물체가 적당한 경우, 약한 참조가 캐시의 메모리 소비를 향상시키는 데 도움이 될 수 있습니다. 그러나 앱이 매우 많은 작은 객체로 작동하는 경우, 참조 객체가 훨씬 더 많은 메모리를 차지하기 때문에 약한 참조가 문제를 악화시킬 것입니다.

다른 팁

MSDN은 좋은 설명을 가지고 있습니다 약한 참조. 키 인용문은 맨 아래에 있습니다.

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

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

약한 회의를 가진 훌륭한 실제 예가 설명되어 있습니다 안드로이드 개발 튜토리얼.

View (ImageView)에는 이미지 (비트 맵)와 이미지 컨테이너가 있습니다. 이미지가 메모리에서로드되면 (예 : 디스크, 네트에서) UI 스레드와 화면을 잠글 수 있습니다. 이를 피하기 위해 비동기 작업을 사용할 수 있습니다.

비동기 작업이 완료되면 문제가 발생합니다. 이미지 컨테이너는 당시에 전혀 유용하지 않을 수 있습니다 (스크롤 후 화면이 변경되거나 Android 언로드 보이지 않는 뷰 파트). 약점은 여기에서 도움이 될 수 있으며 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top