iOS内存相关的知识点整理

一、原起

iOS的内存相关知识是我们开发iOS APP的基石之一,也是面试中必然会问的问题。内存知识的融会贯通,与及内存相关问题的解决,是iOS开发者必须要掌握的。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是我的iOS交流圈: 不管你是小白还是大牛欢迎入驻!!
分享内容包括逆向安防、算法、架构设计、多线程,网络进阶,还有底层、音视频、Flutter等等…
自己根据梳理网络来的的开发经验总结的学习方法,无偿分享给大家。需要的话都可以自行来获取下载。
+裙:196800191、 或者是+ WX(XiAZHiGardenia)免费获取! 获取面试资料 简历模板 一起交流技术

二、iOS内存相关知识点

图片描述

2.1 iOS的内存管理方式
iOS的内存管理机制为引用计数。早期使用的是MRC(手动引用计数),需要开发者自己编写引用计数的代码,对开发者是一个不小的挑战,而且容易出错,给开发者也带来了不小的苦恼。

苹果公司为了让开发者更好的专注于开发,在2011年的iOS5版本开始引入了ARC(自动引用计数),帮助开发者进行内存的管理。

ARC的工作原理大致是:当我们编译源码的时候,编译器会分析源码中每个对象的生命周期,然后基于这些对象的生命周期,来添加相应的引用计数操作代码。
2.2 内存泄漏
内存泄漏(memory leak):是指申请的内存空间使用完毕之后未回收。
一次内存泄露危害可以忽略,但若一直泄漏,无论有多少内存,迟早都会被占用光,最终导致程序crash。(因此,开发中我们要尽量避免内存泄漏的出现)
内存泄漏的现象:程序的可用内存越来越少,最终导致程序崩溃。

2.3 内存溢出
内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用。
内存溢出的现象:程序直接重启或者崩溃。

2.4 内存泄漏的检测
第一种:静态分析方法(Analyze)
第二种:动态分析方法(Instrument工具库里的Leaks)
2.5 常见的发生内存泄漏的场景
2.5.1 AFHTTPSessionManager
AFHTTPSessionManager发生内存泄漏的解决方案在此。

2.5.2 ViewController中的NSTimer
VC中使用NSTImer的示例如下:

[NSTimer scheduledTimerWithTimeInterval:1.0 
                                 target:self 
                               selector:@selector(updateTime:) 
                               userInfo:nil 
                                repeats:YES];

理由:这时 target: self,增加了ViewController的retain count,
即self强引用timer,timer强引用self,造成循环引用。
解决方案:在恰当时机调用[timer invalidate]即可。

2.5.3 ViewController中的delegate
对于delegate我们一般都是使用weak修饰,这个不多作解释。

2.5.4 ViewController中Block
在我们日常开发中,如果block使用不当,很容易导致内存泄漏。
理由:如果block被当前ViewController(self)持有,这时,如果block内部再持有ViewController(self),就会造成循环引用。
解决方案:在block外部弱化self,再在block内部强化已经弱化的weakSelf。

三、 iOS内存管理

图片描述

iOS的内存管理机制是:引用计数。MRC基本上已经绝迹,现在主流的还是ARC。系统的内存分为栈内存和堆内存,栈内存是系统管理的,不需要开发者插手,开发者管理的主要是堆内存。

当下我们使用ARC(自动引用计数)进行管理的是堆内存。

3.1 内存管理的原则
当我们使用alloc、new创建对象之后,对象的引用计数为1.
当我们对对象进行strong、copy操作之后,对象的引用计数+1.
当我们对对象进行mutableCopy操作之后,生成了一份对象的拷贝,而不是简单的引用计数+1,这个需要特别注意。
当我们不再持有对象时,对象的引用计数-1。
当对象的引用计数为0时,对象会被释放掉,进行内存的回收。

3.2 需要开发者自己管理的内存
core foundation框架主要提供的是C语言的API,不属于ARC管理的范畴,所以使用core foundation创建的对象,需要开发者自己进行内存的管理,在对象使用完毕之后进行内存的回收,否则会进行内存的泄漏。

3.3 内存峰值
开发中,对于一些大循环如果把控不好,会出现内存峰值过高的情况,这个时候我们需要在循环的内部合理的使用autoreleasepool进行内存峰值的管理。

总结

本文主要是对iOS内存相关的知识点进行了一个归纳总结。

iOS的内存管理方式为引用计数,分为MRC和ARC。 内存泄漏的原因。 内存溢出的原因。 内存泄漏的排查方法,静态排查&动态排查。
内存泄漏的常见场景。 内存峰值的管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值