مهدی ساعدی
مهدی ساعدی
خواندن ۳ دقیقه·۲ سال پیش

تخصیص حافظه در iOS

کاهش حافظه

چرا باید حافظه کمتری استفاده بشه؟ وقتی میخواهیم حافظه را کاهش دهیم درواقع درمورد درپای حافظه خود صحبت می کنیم.

چرا استفاده از حافظه را کاهش دهیم؟

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

صفحات تمیز و کثیف

حافظه صفحاتی به شما خواهد داد که میتوانید چندین شی را به صورت پشته در آن نگه داری کنید ، برخی اشیاء میتوانند چندین صفحه را پوشش دهند، هر صفحه معمولا 16 کیلو بایت است و میتواند تمیز یا کثیف باشد.

استفاده از حافظه برنامه در واقع تعداد صفحات ضرب در اندازه صفحه است.

مثال:

یک مثال خوب برای این میتواند JPEG باید اگر یک فایل JPEG داشته باشیم که 50 کیلوبایت است ، زمانی که حافظه به آن اختصاص داده میشود , 4 صفحه به آن اختصاص داده میشود که درواقع کاملا پر نیستند و میتوانند برای موارد دیگر نیز استفاده شوند.

کمپرسور حافظه

آی او اس یک سیستم تعویض دیسک سنتی ندارد، در عوض ، از یک کمپرسور حافظه که در iOS 7 معرفی شد استفاده میکند

اپل

وقتی من یک dictionary دارم که برای caching استفاده میکنم درحال حاضر از 5 صفحه استفاده میکنم اما اگر بعد از مدتی از آن استفاده نکنم و سیستم به فضایی نیاز داشته باشد، کمپرسور صفحه را فشرده میکند و تبدیل به یک صفحه میکند و در این صورت من 4 صفحه صرفه جویی کردن و میتونم چیز های دیگه ای در آن ذخیره کنم.

ما نباید بیش از حد cache کنیم ما با cache کردنمون به CPU کمک میکنیم تا اون رو از انجام کار های مکرر نجات بدیم ولی زمانی که بیش از حد cache میکنیم تمام حافظه خود را مصرف میکنیم و این میتواند برای سیستم مشکل ایجاد کند.

به خاطر داشته باشید که بسته به دستگاه، محدودیت شما تغییر خواهد کرد. بنابراین نمی‌توانید در دستگاه‌های 1 گیگابایتی به اندازه یک دستگاه 4 گیگابایتی از حافظه استفاده کنید.

اپل

عکس ها

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

مثال:

2048 x 1536
2048 x 1536

وقتی من یک تصویر با طول 2048 و عرض 1536 و حجم 590 کیلو بایت دارم این به این معنا نیست که 590 کیلو بایت در حافظه جای میگیرد، ولی واقعا چقدر جا میگیرد؟ 10 مگابایت ، اره واقعا 10 مگابایت خیلی زیاده. ولی چه جوری حساب میشه؟

2048 pixels x 1536 pixels x 4 bytes per pixel

تصاویر در iOS چگونه کار می کنند؟

به سه صورت Load , Decode , Render

لود: فایل 590 کیلوبایتی JPEG را که فشرده شده است، در حافظه بارگذاری می کند.

دیکود: آن فایل JPEG را به فرمتی تبدیل می کند که GPU بتواند بخواند. حالا این باید فشرده نشود که 10 مگابایت می شود.

رندر: نمایش تصویر در نمایشگر

چرا باید طول ضرب در عرض ضرب در چهار بشه؟

SRGB: (Standard Red Green Blue)
SRGB: (Standard Red Green Blue)

اکنون 4 بایت در هر پیکسل با فرمت SRGB دریافت کردیم. این معمولا رایج ترین فرمتی است که تصاویر در گرافیک هستند. این 4 بیت در هر پیکسل است، بنابراین شما 1 بایت برای قرمز، 1 بایت برای سبز، 1 بایت برای آبی، و یک جزء آلفا دارید.

مقایسه UIImage و ImageIO

UIImage :


  • برای اندازه و تغییر اندازه گران است
  • تصویر اصلی را در حافظه از حالت فشرده خارج می کند
  • تبدیل فضای مختصات داخلی گران است

ImageIO:

  • اندازه تصویر و اطلاعات فراداده را بدون کثیف کردن حافظه بخواند
  • اندازه تصاویر را فقط با هزینه تغییر اندازه تصویر تغییر دهد

خلاصه

حافظه یک منبع محدود و مشترک است

استفاده از حافظه را هنگام اجرا از Xcode نظارت کنید

اجازه دهید iOS فرمت های تصویر شما را انتخاب کند

از ImageIO برای نمونه برداری از تصاویر استفاده کنید

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

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


منبع: کنفرانس WWDC اپل

حافظهiosxcodeبرنامه نویسی iosبرنامه نویسی
شاید از این پست‌ها خوشتان بیاید