Weak Reference

מוזר שהרבה לא שמעו על המחלקה הזאת...
מה היא עושה? ובכן אנו יודעים שסביבת הריצה של הדוט נט סופרת הפניות לכל אובייקט. כשאני יוצר אובייקט חדש, המשתנה שאני מגדיר הוא בעצם הפניה, כתובת , לאובייקט שיצרתי בזיכרון. לדוגמה:

Bitmap picture=new Bitmap("pic.gif");

בחלק שמאל אני מגדיר הפניה בשם picture לאובייקט שיצרתי בצד ימין והוא מסוג Bitmap
וסביבת הריצה כותבת לה בצד שיש הפניה אחת לאובייקט הזה ולכן היא לא מנקה אותו מהזיכרון. בשורה הבאה:

Bitmap pic2=picture;

הגדרתי עוד הפניה בשם pic2 לאותו אובייקט בזיכרון, וסביבת הריצה כותבת לעצמה שיש 2 הפניות לאותו אובייקט. כל עוד יש הפניות לאובייקט סביבת הריצה לא יכולה לנקות את אותו מקום בזיכרון. מתי מורידים הפניות? או שהגדרתי משתנה בתוך פונקציה והפונקציה סיימה את תפקידה ואז אותו משתנה מסומן כהפניה אחת פחות. או שהגדרתי משתנה במחלקה עצמה ואותה מחלקה סיימה את תפקידה, או שבפירוש הודעתי שאני לא צריך את ההפניה על ידי :

picture=null;

עד כאן הייתה ההקדמה שרובנו יודעים. עכשיו לנושא שלנו. נניח שאני רוצה לשמור בזיכרון הפניה לאובייקטים כדי לא לפנות אליהם כל פעם מחדש, לדוגמה DataSet מתוך דטה בייס. אם אני אתחיל למלא את הזיכרון במידע הוא עשוי להיגמר, מצד שני אני רוצה שהאפליקציה תרוץ מהר ולא תמשוך כל פעם מהדטה בייס... בשביל זה ניתן להשתמש ב WeakReference. המחלקה הזאת מוסיפה הפניה לאובייקט, כך שהוא לא נמחק מהזיכרון, אך זאת הפניה "חלשה", זאת אומרת שאנחנו לא מכריחים את סביבת הריצה לשמור את האובייקט תמיד בזיכרון, זאת יותר מעין בקשה - תשמרו לי הפניה לאובייקט, אבל אם הזיכרון מתחיל להיגמר אתם יכולים למחוק אותו ואז ההפניה שלי תצביע לאובייקט שלא קיים...
זה כל הסיפור... שימו לב לקוד:

System.Drawing.Bitmap picture=new System.Drawing.Bitmap("pic.gif");//we save a big object in memory
WeakReference wr = new WeakReference(picture);//assign a weak reference to it
picture = null;//dispose the strong reference
//do other stuff
System.Drawing.Bitmap mypicture = wr.Get() as System.Drawing.Bitmap;//we try to get our picture
if (mypicture == null)//we check if it still exists... null? it has bee disposed already...
{
    mypicture = new System.Drawing.Bitmap("pic.gif");
}

יצרתי אובייקט שתופס הרבה מקום וגם לוקח זמן לטעון אותו.
יצרתי הפניה חלשה אליו.
הודעתי שאני לא רוצה את ההפניה החזקה אליו. תזכרו שאם יש הפניה חזקה לאובייקט הוא לא ימחק וזה לא מה שאני רוצה!
כעת אני עושה דברים אחרים באפליקציה...
עכשיו כשאני רוצה להשתמש באובייקט התמונה שלי, אני שוב יוצר הפניה חזקה אליו בשם mypicture
אבל... וזה כל העניין פה... אני צרי לבדוק שעדיין יש לי אובייקט! כל הקטע הוא שאני הרשיתי לסביבת הריצה למחוק את האובייקט במקרה הצורך, ולכן אני צריך לבדוק שהוא לא נמחק...

טוען נתונים...
אהבתם?
המליצו לאחרים!

נהניתם? בעיות? הערות?
אני רוצה לשמוע!
rss feed