WeakReference란
 가비지 컬렉션이 메모리를 회수하는 것을 허락하면서 레퍼런스를 참조하고 있는 클래스
    => 약한 참조


문제점


SampleClass a = new SampleClass();
SampleClass b = a;
a = null;
GC.Collect();

 다음과 같은 코드에서 SampleClass 객체는 회수되지 않는다
    => 메모리 누수



예시

1. 게임플레이에 사용되는 미사일들을 관리하는 미사일오브젝트풀러를 만들고 미사일들을 생성


2. 싱글턴으로 제작된 업적매니저가 업적클리어 결과 출력을 위해 미사일매니저의 미사일 하나를 참조(실제로 구현은 이렇게 안함.. 예시를 위해)


3. 게임플레이가 종료되어 업적을 출력한 후 미사일오브젝트풀러를 제거


4. 가비지컬렉션이 레퍼런스를 잃은 미사일들 수거

5. 업적매니저가 참조하고 있는 미사일은 레퍼런스를 잃지 않아서 수거되지 않음




사용법

SampleClass sampleClass = new SampleClass();
WeakReference weakRef = new WeakReference(sampleClass);

if (weakRef.IsAlive)
{
    Console.WriteLine(weakRef.Target);
}

sampleClass = null;
GC.Collect(0, GCCollectionMode.Forced);

if (weakRef.IsAlive)
{
    Console.WriteLine(weakRef.Target);
}




주의사항
Target을 외부에서 참조하지 말 것


Posted by @히테
,