PracticU

ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference
מילון מושגים:
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
ירושה - מנגנון בתכנות מונחה עצמים שבו מחלקה יורשת תכונות ופעולות ממחלקת אב, ויכולה להרחיב אותן.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).

ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference
סטרקטים הם value types, ולכן כל העברה שלהם יוצרת עותק. מחלקות הן reference types, ולכן מועתק רק מצביע לאותו אובייקט בזיכרון. ההבדל הזה משפיע ישירות על התנהגות התוכנית.
איך זה עובד
1. שני אזורי זיכרון: הזיכרון מחולק בעיקר ל-stack ול-heap. ערכים פשוטים וסטרקטים נשמרים ב-stack, ומחלקות נשמרות ב-heap, והמשתנה שב-stack מחזיק מצביע אליהן.
2. value types: כשמעתיקים סטרקט נוצר עותק עצמאי, ושינוי בעותק לא משפיע על המקור. למשל, אחרי ששינו את x בעותק ל-100, הערך במקור נשאר 10.
3. reference types: כשמעתיקים מחלקה מועתק רק המצביע. שני המשתנים מצביעים לאותו אובייקט, ושינוי דרך אחד מהם נראה גם בשני.
4. דוגמה בדיבאגר: בהרצה בדיבאגר רואים שני מצביעים שמצביעים לאותה כתובת בזיכרון, בעוד שסטרקט נשמר במלואו ב-stack.
5. בחירה: המרצה ממליץ להעדיף סטרקטים ככל האפשר. מחלקות נדרשות כשצריך ירושה או התנהגות שמבוססת על רפרנס. ה-view controller הוא מחלקה כי הוא יורש מהמחלקה UIViewController.
שימו לב
כשמעתיקים מחלקה, צריך לזכור שהעותק הוא רפרנס לאותו אובייקט ולא עותק נפרד.
בסיום תדעו להסביר למה סטרקט מועתק ומחלקה מצביעה על אותו אובייקט.
השיעור הבא בקורס: פרוטוקולים ומימושם - Protocols

פרקי ההרצאה: ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference

  1. 00:00

    מבוא להבדל בין סטראקטים למחלקות בזיכרון

  2. 00:42

    יצירת Point כסטראקט וכמחלקה

  3. 02:07

    יצירת מופע מסטראקט ומופע ממחלקה

  4. 03:11

    מחלקות הן Reference Types ומועברות בהפניה

  5. 04:01

    Stack ו-Heap: איפה נשמרים הערכים

  6. 05:14

    משתנים פרימיטיביים ב-Stack והעתקתם

  7. 06:27

    עותק של סטראקט והעתקת כל הערכים

  8. 08:28

    הוכחה: שינוי העותק לא משנה את המקור

תמלול ההרצאה: ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference

הטקסט המלא של הדקות הראשונות בהרצאה «ניהול זכרון - העברת משתנים לפי ערך ולפי מצביע - Classes Are Reference» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    שלום וברוכים הבאים אנחנו רוצים לדון היום על עוד הבדל משמעותי בין סטראקטים לבין מחלקות אז בשביל להסתכל טוב טוב על הדוגמה של היום בואו נקפץ רגע על הקלאס הזה שנקרא view controller אנחנו רואים למעשה שיש פה כבר קלאס ויש פה מתבצעת ירושה ואפילו אני רואה שהפונקציה view did load היא פונקציה שאני יורש

  2. 00:24

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

  3. 00:50

    הסטראקט שאני רוצה לייצר ייקרא פוינט אוקיי אז בואו נעשה אותו והפוינט הזה ייצג נקודה במרחב x וy אז בואו נראה סטראקט פוינט ולפוינט כדי להגדיר נקודה במרחב צריך להגדיר x ו-y אז בוא נאמר var x הוא יהיה מספר שלם נניח ו-var y הוא יהיה מספר שלם אוקיי סטראקט סיימתי להגדיר עובד יופי מה לגבי קלאס אם היינו

  4. 01:24

    רוצים להגדיר קלאס אז היינו כותבים קלאס בואו נקרא לו point c כדי לציין שהוא בעצם מחלקה אני לא רוצה לרשת משום דבר אבל אני יכול כי אני בקלאס כמו שאתם רואים השלמה אוטומטית פה מזכירה לי את זה ואתם יודעים אם אני רוצה להגדיר x ו-y כמשתנים אז אני חייב חייב מה אני חייב בניי נכון אז init

  5. 01:50

    ונקבל את x ואת y ונשמור אותם אז עד כאן זה היה בעצם למעשה תרגול כשכזה נכון init ליצור קלאס ליצור סטראקט פנטסטי אז איפה ההבדל אתם יכולים לשאול ההבדל בואו נעמוד עליו עכשיו אני קודם כל אייצר הופעה של הסטראקט ושל הקלאס אז אני אגיד let st struct point שווה ל-point שיצרנו אותו מהסטראקט אתם רואים

  6. 02:28

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

  7. 02:38

    אוקיי אני אצר נקודה אחת נגיד 10 ו-20 וזה הסטראקט שלי והמופע מהסטראקט בוא נעשה אותו כבר ואני אצר מופע מהקלאס אז בוא נגיד קלאס פוינט שווה לפוינט סי הפעם ואם אתם רוצים אז בוא נגיד 30 x שיהיה 30 ו-y שיהיה פה 40 אז עד כאן לכאורה נראה מאוד מאוד דומה אתם חייבים להסכים עכשיו אוקיי עכשיו בוא נדבר באמת על ההבדל ראשית אני אפתח קודם כל באיזושהי טענה אני

  8. 03:23

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

  9. 03:43

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

  10. 03:55

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

  11. 04:05

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

  12. 04:24

    עכשיו ב-stack שלנו אנחנו שומרים value types, אנחנו שומרים משתנים פשוטים, למשל structים. structים הם value types, איזה value types אנחנו מכירים?

  13. 04:37

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

  14. 04:57

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

  15. 05:14

    עכשיו אם אני פשוט מגדיר את x להיות 10 x נשמר בסטאק בזיכרון של הסטאק אם אני מגדיר את y להיות נניח 20 גם y יאללה שמים אותו בסטאק אם אני בא ואומר בקוד שלי z שווה ל-y אוקיי אז מה יקרה בסטאק מה אתם אומרים מה יהיה פה בסטאק z יהיה שווה 20. יפה אז זאת התמונה של הסטאק עבור משתנים פרימיטיביים פשוטים לגמרי.

  16. 05:41

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

  17. 05:52

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

  18. 06:07

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

  19. 06:24

    במילים אחרות אם עכשיו אנחנו נעשה קופי של הפוינט שלנו אנחנו נעתיק את כל הערכים מה זאת אומרת נעתיק אנחנו נעתיק את x להיות 10 ואת y להיות 20 ועכשיו יש לי שני עותקים ששניהם מכילים פעמיים את כל המידע.

  20. 06:42

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

  21. 07:12

    קופי מה זאת אומרת עשינו למעשה ענית חדש והכנסנו X 10 והכנסנו Y 20. זאת התמונת זיכרון שלי עכשיו, שימו לב, זאת התמונת זיכרון, יש לי את הפוינט ויש לי את הפוינט קופי, שניהם, הנה זה הפוינט קופי שלי וזה הפוינט, יפה?

  22. 07:32

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

  23. 07:44

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

  24. 07:51

    כי זה סטראקט, וסטראקטים הם value types. כלומר, נשמרים בזיכרון של הסטאק, בסדר?

  25. 08:02

    saved in the stack, ואם צריך קופי, כמו שניסינו לעשות, a שווה ל-b, אז קופי, נכון? Copied by values.

  26. 08:14

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

  27. 08:29

    איקס עכשיו יהיה שווה ל-100 בסדר בואו נדפיס את הערך של פוינט נקודה איקס ובואו נדפיס את הערך של קופי נקודה איקס מה אתם אומרים שזה ידפיס אני אומר ככה פוינט ידפיס 10 ופוינט קופי ידפיס 100 זאת ההתנהגות של סטרקטים גבירותיי ורבותיי זאת ההתנהגות של value

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: מחלקות ירושה - Classes Inheritance

ההרצאה הבאה: פרוטוקולים ומימושם - Protocols

הרצאות קשורות מקורסים אחרים

  • classes - חלק 1
  • משתנים
  • משתנים - חלק 1
  • ניהול OU

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון