关于iOS内存的一些想法
最近也在面试一些童鞋,问的频率比较高的问题之一就是内存
我觉得内存管理是ios制胜法宝之一,系统流畅度和美观,电池续航几乎构成了苹果全部优点。现在电池和美观随着安卓的崛起,已然没多少优势了。而流畅度则依然是安卓打不败iOS的门槛。
内存管理,不止于系统。还有APP的设计,需要我们iOS开发人员一起来维持流畅性。
我面试问内存管理,其实主要想听一下几方面:
1,内存管理的机制
不想谈MRC了,太老了,只ARC。ARC机制简单点说就是引用计数器。
强引用+1(其实创建的时候一般会创建一个强引用指针引用),弱引用不加。强引用每销毁一个就计数器减一,到0了就会自动找合适时机释放。释放目前大部分oc对象会自动释放,而涉及到C语言需要手动释放。
2,内存管理工具
instrument
---Leaks 内存泄露监测工具
---Allocations 内存分配工具
---Core Animation监测离屏渲染
---Zommbies僵尸对象的监测
3,造成内存暴增及内存高的缘由
一般内存暴增是因为图片或者视频等比较大的文件直接加载到了内存中,或者大图片滤镜处理等一些比较耗内存显存的操作。内存暴增会导致内存警告进而有可能被系统灭掉。
内存高的原因则有几种,主要指平缓增高。控制器太多,堆栈里不断加载新的控制器和数据,层层深入。某个界面动画循环,不断加载。图片较大,内存中图片较多。一般内存平缓增高不会涉及到内存警告。
当然除了循环引用循环调起某方法或操作。
4,内存释放,内存警告,内存泄露
内存释放一般有几种方式:把sd的缓存在内存里的图片缓存清空。将不在window上显示的view移除,以及在控制器销毁时将大的数据集合指针置nil。
内存泄露一般是野指针,指向不存在的对象,或者称之为内存区域。内存泄露一般为对象提前释放导致。查找原因则需要借助工具和打断点,有的藏的比较深的,需要一步一步的去找,没有什么特别的捷径。
5,内存优化-控件使用方面-重用-单例-懒加载等等
控件如果不涉及到交互,仅仅是用来显示,那么layer足够,轻量级
重用则是cell的重用-原理-NSSet做缓存池-当然也可以数组字典。-离屏放缓存池-即将进屏取cell
无限滚动轮播的imageview重用,定时器与手势的交互注意事项。
单例的使用-如果一个就能处理,那么整个app只创建一次。(话说,其实类就是一个单例)
懒加载-将不开始就显示的控件和不使用的集合等等进行懒加载,减少内存集中调用。
另控件及图片的使用,尽量减少控件和图片的透明效果,透明越多,需要渲染面积越大。