מדד וחקירה
כיצד אופטימיזציה של ניהול זיכרון ב- Ios Apps לביצועים טובים יותר
Table of Contents
אופטימיזציה של ניהול זיכרון היא גורם קריטי באספקת יישומים iOS ביצועים גבוהים.שימוש זיכרון יעיל ישירות משפיע על תגובת אפליקציה, חיי סוללה, וסיפוק המשתמש הכולל. בעוד ש-Apple של הסימון ההפניה האוטומטי (ARC) אוטומטי של הרבה מההרמת הכבדה, מפתחים חייבים עדיין לאמץ אסטרטגיות מכוונים כדי להימנע מדלפות, להפחית את טביעת הרגל שיא, ולהגיב בחסד ללחץ המערכת.
ניהול זיכרון iOS
iOS משתמש בספירת הפניה אוטומטית (ARC) כדי לנהל את מחזור החיים של אובייקטים. ARC באופן אוטומטי מוסיף (FLT:0) ו-FLT:1 קורא בזמן הרכיב, תוך התמודדות עם אובייקט כאשר הספירה לאחור הספירה לאחור שלה לאפס.עם זאת, ARC אינו מונע את כל בעיות הזיכרון - החלטות מפתח על סוגי התייחסות, מבני נתונים, מחזורי משאבים להישאר מכריע.
איך ARC עובד
בכל מקרה של סוג התייחסות (class) יש ספירה של שמירה.כאשר אתה להקצות התייחסות למשתנה, ARC מגביר את הספירה. כאשר משתנה זה יוצא מההיקף או מוגדר ל-FLT:2, ARC משמיד את הספירה.האובייקט הוא מצורף כאשר הספירה מגיעה אפס.
חזק, חלש, והערות לא ידועות
ARC תומך בשלושה סוגי התייחסות:
- (ב) [ה]ה']: [ה'], [ה'], [ה'], [ה'], [ה'], [ה']'[ה']'[ה']'[ה']'[ה']'[ה']'[ה']'[ה']']'[ה']'[ה']'[ה'[ה']']']'[ה'[ה']'[ה'[ה']'[ה'[ה']'[ה'[ה'[ה'[ה']']']'[ה'[ה'[ה'[ה']']']']']']'[ה'[ה'[ה'[ה']']']']']'[ה'[ה']']'[ה'[ה'[ה'[ה']'[ה'[ה']']'[ה'[ה'[ה'[ה']'[ה']']'[ה'[ה']']'[ה'[
- (ב) [ה]]: [ה], [ה], [ה],] אין [ההפניה] ל[ה] [המילה]]] [ההה]]]]], אלא אם כן, היא אינה מבססת את ה[[המאה ה-20]].
- (ב) ,[דרוש מקור]: "[דרוש מקור] [ב]], אך אם כן, [ה], [ה], [ה], [ה], [ה]]], [התחילה], [התחילה], לא תירא [ה'''''] את ה'''''''''], אלא אם כן, [ה']
הבנת ההבדלים הללו חיונית למניעת דליפות זיכרון ותאונות.
Best Practices for Optimizing Memory Usage
החלת שיטות אלה באופן עקבי מפחיתה את לחץ הזיכרון, משפרת את הביצועים, ומפחיתה את הסיכון לסיומו של שומר הזיכרון של iOS.
פרופיל קבוע עם מכשירים
Xcode Instruments הוא הכלי החזק ביותר לניתוח זיכרון.כלי מפתח כוללים:
- (ב) ,0) אל-מעברים (FLT:1): מעקבים אובייקטים יוצרים וחלוקת-הפעולה. השתמש בתכונה "דור מארק" כדי להשוות את השימוש בזיכרון בין פעולות.
- (ב) ,0 ל-[[1924]]: [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]
- (ב) [ה]ב[[173]]: [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]
להפוך את החדירה לחלק מזרימת העבודה של פיתוחך - במיוחד לפני פרסום:0 Apple Instrumentssert DocumentFLT:1 מספק מדריך מפורט על תוצאות מפרשים.
תגובה לMemorial Warnings
iOS שולח את ה-FLT:9 כאשר המערכת נמוכה בזיכרון, נכשל להגיב יכול להוביל לתאונה.
- (ב) , (ב) ,ב-[[1948]] או [[המאה ה-20]].
- תמונות גדולות שניתן לנסח מחדש מדיסק
- מודלים של תצוגה או נתונים לא קריטיים
דוגמא:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
imageCache.removeAllObjects()
thumbnailCache.removeAllObjects()
// Clear any other disposable resources
}
בנוסף, מומלץ לשקול את המשאבים החופשיים (FLT:13) כדי לא להיות נחוץ כאשר הנוף הוא מחוץ למסך.
להימנע ממחזורים
מחזורי Retain הם דליפת הזיכרון הנפוצה ביותר באפליקציות iOS.תרחישים אופייניים כוללים:
- (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ב[[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]]
- (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
דוגמה לסגר בטוח:
networkManager.fetchData { [weak self] result in
guard let self = self else { return }
self.updateUI(with: result)
}
(ב) רק כאשר אתה בטוח כי FLT:21 לא יהיה מעורב לפני סגירת הסוף (למשל, אנימציה קצרת ימים).
אופטימיזציה של נתונים
לטעון נתונים מיותרים לפסולת זיכרון, להעסיק את הטכניקות האלה:
- (ב) ויקרא י"א: "ה', כ"כ: "ה', כ"כ," (בראשית כ"ד, כ"ד).
- (ב) ,0) ,ב"הבא" (ב) "ב"ה: עם מידע ראשוני, השתמש ב-"FLT:22 מגבלות וגודלי אצווה כדי להימנע מטעינה של כל האובייקטים בזיכרון בבת אחת.
- (ב) ויקרא י"ד: "א' ויקרא י': "אשתמש ב' ויקרא יט' (ב) ולא ב'"ד' (ב)"ב).
- (ב) ,0) תמונות של ההרחבה (FLT:1): כאשר מציגים את האגודלים, יוצרים גרסאות בקנה מידה באמצעות קונסולת:26 כדי להימנע מצפייה מלאה בדימויים ברזולוציה.
(ב) לעיין ב[[המאה ה-20]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]
החזרת משאבים בצפייה במפקחים
בקרים תצוגה יש לעתים קרובות משאבים רבים: משקיפים, מתבוננים, מזהים מחוות ומבנים גדולים של נתונים.תמיד לנקות את עצמם ב-FLT:30 או שיטות מחזור חיים מתאימות:
- הסרת רישום משקיפים (FLT:31, KVO)
- צירים בלתי חוקיים והצגת קישורים
- ביטול פעילות הרשת בעת עזיבת מסך
- « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
טכניקות ניהול זיכרון מתקדמות
עבור יישומים הדוחקים את הגבולות - כגון אלה עם נתונים גדולים, עיבוד בזמן אמת, או עיבוד רקע - טכניקות עמוקות יותר הם הכרחיים.
שימוש ב- Autorelease Pools
בריכות אוטומטיות מתרוקנות באופן אוטומטי בסוף ההצתה של הלולאה, אבל הם יכולים לצבור חפצים רבים במהלך לולאות כבדות (למשל, עיבוד של ערכים גדולים) ולעס את גוף הלולאה בבריכה מפורשת של שחרור פריטים מוקדם יותר:
for i in 0..<100000 {
autoreleasepool {
let heavyObject = createHeavyObject(i)
// use heavyObject
}
}
זה מקטין את השימוש בזיכרון השיא באופן דרמטי.ה-FLT:0 תיעוד של אפל על בריכות רפואת רכב: 1.
סוגי ערכים לעומת סוגי ה- Reference
(סוגים ערכיים) מאוחסנים בקו רוחב ויכולים להפחית הקצאות הערימה.לעדיף מבנים עבור אובייקטים מודל שיש להם ערך פשוט סמנטיה.
זיכרון ממפה קבצים גדולים
עבור קבצים גדולים של נתונים (סרטונים, מסדי נתונים), השתמש במיפוי זיכרון עם (FLT:38 לטעון נתונים ללא צריכת שטח החלפת.FLT:39 ב Swift ניתן ליצור עם אפשרות עצלן טעינה ולהימנע משימוש זיכרון כפול (דיסק cache לעומת in-mory).
if let data = try? Data(contentsOf: fileURL, options: .mappedIfSafe) {
// use data — pages are loaded on demand
}
מיפוי זיכרון יעיל במיוחד עבור נתונים לקריאה בלבד כגון דיוורקציות או נכסים מראש.
משימות רקע וזיכרון
כאשר מבצעים משימות רקע (למשל, FLT:42), הזיכרון מוגבל לצמצום השימוש בזיכרון במהלך ביצוע רקע כדי להימנע מהשלמת השימוש.
בעיות זיכרון נפוצות ופתרונות
גם בתכנון קפדני, בעיות זיכרון יכולות להגיע.כאן הן בעיות טיפוסיות וריפוייהן.
Zombie Objects and Dangling Pointers
אובייקטים משוחררים גורמים לתאונות עם FLT:44 ניתן לאבחן את אובייקטים זומביים בהגדרות התוכנית של Xcode כדי לזהות אלה במהלך הפיתוח.הסיבה השורשית היא לעתים קרובות טעות בין אזכורים חזקים חלשים, במיוחד עם צירים כי הם משוחררים מוקדם או לא מוגדר כראוי כדי לזהות את אלה במהלך הפיתוח.
זיכרון צמיגים עם מכשירים
הפעל את מכשיר ה-Lek תוך ביצוע זרימת משתמשים טיפוסית.לתשומת לב מיוחדת:
- תוצאות חיפוש עבור בקר (push/פופ)
- מצגות משתנות
- המונחים: shot
- ספריות של צד שלישי
אם מופיעה דליפה, בחנו את גרף ההתייחסות בכלי גרף זיכרון דגו (הגרף של Xcode debugger) מיצג חזותי זה לעתים קרובות חושף מחזורים באופן מיידי.
זיכרונות שפיכות ושורשים
בד"כ, ספיגות זיכרון פתאומיות נגרמות על ידי:
- (ב) ויקרא י"א: "ה', ב': "וַיָּבְּבְתָּבוּ לָבָרֶת אִתָּבְתָּבָה הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא הוּא .
- (ב) ,0) ,JSON parsingingFLT:1: Deserialize JSON ב- פיסות או שימוש ב- ⁇ s עבור תשובות ענקיות.
- (ב) ,0) נתונים ממושכים אשר גדלים ללא הגבלה: קביעת גבולות על שורת טיהור טיהור וטיהור קטי.
- (ב) ,0) ,לקבל זמנם או ל-CAD, ⁇ : ודאו שהם לא תואמים כאשר לא בשימוש.
מעקב אחר זיכרון שיא עם כלי Allocations ולהגדיר נקודות התראה זיכרון כדי לתפוס ספייקטים.
מסקנה
אופטימיזציה של ניהול זיכרון באפליקציות iOS היא תהליך מתמשך המשלב הבנה של ARC עם שיטות קידוד ממושמעות וסימולציות קבועות.התחל עם היסודות - באמצעות אזכורים חלשים, תגובה לאזהרות זיכרון, ו profiling עם מכשירים - ולאחר מכן אימוץ טכניקות מתקדמות כמו בריכות אוטומטיות ומיפוי זיכרון עבור תרחישים ניהול ביצועים גבוהים.