بهینه سازی مدیریت حافظه یک عامل مهم در ارائه برنامه های کاربردی iOS با عملکرد بالا است.استفاده کارآمد حافظه به طور مستقیم بر پاسخگویی برنامه، عمر باتری و رضایت کلی کاربر تأثیر می گذارد، در حالی که شمارش مرجع خودکار اپل (ARC) بسیاری از تکنیک های سنگین را خودکار می کند، توسعه دهندگان هنوز باید استراتژی های عمدی را برای جلوگیری از نشت، کاهش حافظه، و پاسخ دادن به سیستم فشار به این مقاله، بهترین روش های بهینه سازی حافظه، و کاربردی، برای پوشش دادن حافظه های کاربردی، و اجرای عملی، برنامه های کاربردی، برنامه های کاربردی، و پوشش دادن حافظه های کاربردی، و کنترل دقیق، برنامه های کاربردی، استفاده کنند.

درک مدیریت حافظه iOS

iOS از شمارش اتوماتیک مرجع (ARC) برای مدیریت چرخه عمر اشیاء استفاده می کند. ARC به طور خودکار (FLT:0) و در زمان کامپایل تماس می گیرد، یک شی را زمانی که شمارش مرجع آن به صفر کاهش می یابد، ARC از همه مسائل حافظه جلوگیری نمی کند - تصمیم های توسعه دهنده در مورد انواع مرجع، ساختارهای داده و منابع چرخه عمر حیاتی باقی می ماند.

چگونه ARC Works

هر نمونه از نوع مرجع (درجه) دارای شمارش نگهدارنده است. [۱] هنگامی که شما یک مرجع را به یک متغیر اختصاص می دهید، ARC شمارش را افزایش می دهد.هنگامی که این متغیر از محدوده خارج می شود یا تنظیم شده است تا ، ARC دو مورد را حفظ کند: این شیء زمانی که شمارش به صفر برسد، محاسبه می شود.

قوی، Weak و مرجع های غیر دولتی

ARC از سه نوع مرجع پشتیبانی می کند:

  • [FLT 1 ] ] [Ffault: Increment شمارش حفظ و نگهداری از آن] - این شی تا زمانی که حداقل یک مرجع قوی وجود دارد زنده می ماند.
  • [[۱] [۱۰] [۱۰] [۱۰] [۱] [۱]]: آیا شمارش را افزایش نمی دهد؟ مرجع به طور خودکار تنظیم شده است به هنگامی که جسم به توافق رسیده است، از منابع ضعیف برای جلوگیری از چرخه های حفظ (به عنوان مثال، اموال نمایندگی).
  • [در این باره] [و [از این رو] [و [از این رو] [و] [و] [و [از این رو] [و] [از این رو] [و] [از این رو] [از این رو] [براى] [و]] [و]] [از [و]]]]] [و] [در قیامت] [و [در قیامت] [و [و [از [و] [و] [از [و] [و] [و] [در قیامت] [از [و] [و [از [به] [و]]]] [در قیامت] [و [و] [و]]]] [و [در قیامت] [و [و [در قیامت] [از [از [از [از [از [و] [از [از [و] [از [از [از [از [از [از [از [از [از [از [از [از [از [از [از [از [از [از [از [در قیامت]]]]]]]]]]]] [و]]]]] [از [و] [در قیامت]]] [و [و

درک این تفاوت ها برای جلوگیری از نشت حافظه و تصادفات ضروری است، به عنوان مثال، ثبت نام (FLT-7) به شدت در داخل بسته بندی که توسط نگه داشتن یک چرخه حفظ کلاسیک است.

بهترین روش ها برای بهینه سازی استفاده از حافظه

استفاده از این شیوه ها به طور مداوم فشار حافظه را کاهش می دهد، عملکرد را بهبود می بخشد و خطر خاتمه توسط ساعت حافظه iOS را به حداقل می رساند.

پروفایل به طور منظم با ابزار

ابزار Xcode قدرتمندترین ابزار برای تجزیه و تحلیل حافظه است.

  • مکان ها : پیگیری ایجاد و استقرار شی، استفاده از ویژگی "Mark Generation" برای مقایسه استفاده از حافظه بین اقدامات.
  • Leaks : به طور خودکار شناسایی اشیاء نشت یافته است.
  • ردیاب VM : نظارت بر حافظه مجازی، از جمله صفحات کثیف، که می تواند آموزنده تر از استفاده انبوه برای داده های بزرگ است.

یک بخش از گردش کار توسعه خود را به ویژه قبل از انتشار، تنظیم کنید. اسناد ابزار اپل یک راهنمای دقیق در مورد نتایج تفسیر ارائه می دهد.

پاسخ به هشدار حافظه

در این هنگام، سیستم به صورت زیر به صورت زیر به سمت خود می رود و در صورت عدم توانایی در اجرای آن، می تواند به یک ضربه منجر شود.

  • (به عنوان مثال، در این صورت، [[FLT: 11]] یا [[Square]] قرار می گیرد.
  • تصاویر بزرگ که می توانند از دیسک بارگیری شوند
  • مدل های دید قابل توجه یا داده های غیر بحرانی

پیاده سازی مثال:

override func didReceiveMemoryWarning() {
 super.didReceiveMemoryWarning()
 imageCache.removeAllObjects()
 thumbnailCache.removeAllObjects()
 // Clear any other disposable resources
}

علاوه بر این، به بررسی منابع رایگان که در هنگام مشاهده خارج از صفحه مورد نیاز نیست، توجه کنید.

اجتناب از چرخه های نگهداری

چرخه های نگهداری رایج ترین نشت حافظه در برنامه های iOS هستند.

  • [[۱] [۱۰] [۱۰] [۱۰] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۱]] [۱] [۱] [۱] [۱۰] [۱]] [۱] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۱] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۱] [۳] [۳] [۳] [۱] [۱] [۱] [۱
  • (وَهُمْهُمْهُمْهُمْهُمْهُمْهِ وَهُمْهُمِهُوا مِنَّاِنَهُوا مِنَهُمِهُوا مِنْمِنَاِنِهِهِهِهِهُوا وَهُوا مِهُمَهُوا مِهُوا مِهُوا مِهُوا مِهُوا مِهُوا مِنَهُوا مِنْمْهُوا مِنْمْمْهُوا مِنْهُوا مِنْهُمْمْمْهُوا مِهُوا مِنَاَاْهُوا مِنْهُمْهُوا مِنَاَاَاِنَهُمِنَهُمَاَاَاِنَهُوَهُوا مِنَاِنَهُوَاَهُم
  • [در این میان] [از این رو] به [وحرام] بسته می شود؛ فهرست های ثبت شده را به طور مداوم در هر بسته ای که مرجع خاص خود را ثبت می کند، اعمال کنید.

مثالی از بسته بندی امن:

networkManager.fetchData { [weak self] result in
 guard let self = self else { return }
 self.updateUI(with: result)
}

از آن استفاده کنید تا زمانی که مطمئن شوید که قبل از پایان کار، به طور کامل از آن استفاده نکنید.

بهینه سازی Data load

بارگذاری داده های غیر ضروری به منابع هدر رفته حافظه، این تکنیک ها را به کار بگیرید:

  • [[۱] [۱۰] [۱]: [۱۰] ایجاد اشیاء گران قیمت را تا زمانی که نیاز باشد، به تاخیر بیندازید.
  • جمع آوری ؛ با داده های هسته ای، از محدودیت ها و اندازه های دسته ای استفاده کنید تا از بارگیری تمام اشیاء به حافظه در یک زمان اجتناب کنید.
  • [FLT3] [FLT: 1 ] استفاده از به جای برای کش ها - آن را به طور خودکار اشیاء را تحت فشار حافظه آزاد می کند.
  • تصاویر را جمع آوری می کند: هنگامی که تصاویر ریز را نمایش می دهید، نسخه های مقیاس شده را با استفاده از [FLT 26] ایجاد کنید تا از تصاویر با وضوح کامل در حافظه جلوگیری شود.

برای پاسخ های شبکه، JSON را به صورت تدریجی ([FLT 27] با یا از پخش کننده های مانند [FLT 29] با محموله های بزرگ استفاده کنید.

انتشار منابع در کنترل کننده های View

کنترل کننده های مشاهده اغلب منابع زیادی دارند: ناظران، تایمر ها، تشخیص دهنده های حرکتی و ساختارهای بزرگ داده ها همیشه در روش های چرخه عمر مناسب تمیز می شوند:

  • ثبت نام ناظر ([FLT 31]
  • زمان بندی و لینک های نمایش
  • عملیات شبکه را در هنگام ترک یک صفحه
  • در این میان، در ، قرار دهید.

تکنیک های مدیریت حافظه پیشرفته

برای برنامه هایی که محدودیت ها را فشار می دهند – مانند برنامه هایی که دارای مجموعه داده های بزرگ، ارائه زمان واقعی یا پردازش پس زمینه هستند – تکنیک های عمیق تر ضروری هستند.

استفاده از Auto Release Pools

استخرهای آزاد خودکار به طور خودکار در پایان یک حلقه اجرا تخلیه می شوند، اما می توانند در طول حلقه های سنگین، بسیاری از اشیاء را جمع آوری کنند (به عنوان مثال، پردازش آرایه های بزرگ).

for i in 0..<100000 {
 autoreleasepool {
 let heavyObject = createHeavyObject(i)
 // use heavyObject
 }
}

این کار استفاده از حافظه را به طور چشمگیری کاهش می دهد. اسناد اپل در استخرهای آزاد خودکار مکانیسم را به طور دقیق توضیح می دهد.

انواع ارزش در مقابل انواع مرجع

سوئیفت (نوع های ارزش) به صورت مستقیم ذخیره می شوند و می توانند تخصیص های توده ای را کاهش دهند، ساختارهایی را برای اشیاء مدل که دارای معانی ارزش ساده هستند، ترجیح می دهند.با این حال، آگاه باشید که ساختارهای بزرگ می توانند باعث پر شدن پشته یا کپی کردن هزینه ها شوند. :35 بستن یا LT ۳۶ با [FLT 37 برای ساختارهای پیچیده]

حافظه Mapping Files بزرگ

برای فایل های بزرگ داده (فیلم، پایگاه داده)، از نقشه برداری حافظه با استفاده از [FLT 38] برای بارگیری داده ها بدون استفاده از فضای مبادله استفاده کنید. [FLT 39] در Swift می تواند با گزینه (FLT:40 ایجاد شود. [این اجازه می دهد بارگذاری تنبل و اجتناب از حافظه دوگانه (حافظه در مقابل).

if let data = try? Data(contentsOf: fileURL, options: .mappedIfSafe) {
 // use data — pages are loaded on demand
}

نقشه برداری حافظه به ویژه برای داده های تنها خواندن مانند آلودگی یا دارایی های پیش فرض موثر است.

Task and Memory Constraints

هنگام انجام کارهای پس زمینه (به عنوان مثال، حافظه محدود است.کاهش استفاده از حافظه در طول اجرای پس زمینه برای جلوگیری از خاتمه استفاده از برای رسیدگی به موقعیت های کم حافظه و یا دفع عملیات بزرگ به پیش زمینه.

مسائل مربوط به حافظه و راه حل های مشترک

حتی با برنامه ریزی دقیق، مسائل حافظه می توانند به سطح برسند.در اینجا مشکلات معمول و درمان های آنها وجود دارد.

زامبی ها و نقاط عطف

اشیاء منتشر شده باعث تصادف با (FLT:44) می شوند که تشخیص زامبی در تنظیمات طرح Xcode را برای تشخیص این موارد در طول توسعه فراهم می کند. علت ریشه اغلب یک عدم تطابق بین منابع قوی و ضعیف است، به ویژه با نمایندگانی که پیش از موعد آزاد شده اند یا به درستی تنظیم نشده اند.

تشخیص حافظه با ابزار

اجرای ابزار نشت در هنگام انجام جریان های کاربری معمولی توجه ویژه ای به موارد زیر را انجام دهید:

  • انتقال کنترل کننده مشاهده (push/pop)
  • سخنرانی های اصلاحی
  • بسته های با مراجعات اسیر
  • کتابخانه های شخص ثالث

اگر نشتی ظاهر شود، نمودار مرجع را در ابزار Debug Memory Graph (Dickger) بررسی کنید (این نمایش بصری اغلب چرخه ها را بلافاصله آشکار می کند.

حافظه اسپایک ها و ریشه های آن ها

معمولاً افزایش ناگهانی حافظه ناشی از:

  • بارگذاری تصویر بزرگ ؛ همیشه تصاویر مقیاسی را به اندازه مورد نیاز برای نمایش، استفاده کنید.
  • JSON در حال تجزیه و تحلیل [FLT 1] است: Deserialize JSON در بخش های مختلف و یا استفاده از پخش کننده برای پاسخ های بزرگ.
  • داده های جمع آوری شده که بدون محدودیت رشد می کنند [FLT 1]: محدودیت هایی را بر روی تنظیم کنید و به طور فعال پاک کنید.
  • (فَلَّهُمَهُمْهُمْهُمَهُمْهُمَهُمَهُواًاًاًاًاًاًاًاًاً وَمْهُوا مِنَهُواًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاً، وَهُوا مِنَهُوا مَهُواًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاً، وَهُوا مَهُوا مَهُواًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاً

نظارت بر حافظه اوج با ابزار Allocations و تنظیم نقاط هشدار حافظه برای گرفتن پرش.

نتیجه گیری

بهینه سازی مدیریت حافظه در برنامه های iOS یک فرایند مداوم است که درک از ARC را با شیوه های کد نویسی منظم و پروفایل منظم ترکیب می کند.با استفاده از منابع ضعیف، پاسخ به هشدارهای حافظه و پروفایل با ابزار برنامه نویسی ابزار - سپس تکنیک های پیشرفته مانند استخرهای انتشار خودکار و نقشه برداری حافظه برای سناریوهای عملکرد بالا را اتخاذ کنید.