内存管理了解么?讲一下内存管理。
1、机制
OC采用引用计数器的方式对内存进行管理,当一个对象的引用计数(retainCount)为0时才能被释放。内存机制可以简单的概括为:谁持有(retain)谁释放(release),根据代码执行的上下文环境,在适当的位置插入retain,release。
strong和weak关键字:
strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动释放。
weak修饰的指针变量指向对象时,当对象的拥有者指向新值或者不存在时,weak修饰的指针就会自动置为nil。
2、原理
iOS内存管理机制的原理是引用计数。引用计数分为自动内存管理(ARC)和手动内存管理(MRC)。ARC的本质就是MRC,ARC是系统帮助开发者管理已经创建好的对象或者内存空间,自动在系统认为合适的时间、地点释放掉内存空间。
在MRC中会引起引用计数变化的关键字有:alloc、retain、copy、release、autorelease,(strong 关键字是只用于ARC,作用等同于retain)。
alloc:当创建一个类对象时,需要开辟新的内存空间会调用alloc,alloc是一个类方法,只能用类调用,它的作用是开辟一块新的内存空间,并使这块内存空间的引用计数由0增加到1。
retain:retain是一个实例方法,只能由对象调用,它的作用是使这个对象的内存空间的引用计数加1,并不会开辟新的内存空间,通常是赋值时调用。注:类似浅拷贝。
copy:copy是一个实力方法,只能由对象调用,返回一个新的对象。它的作用是复制一个对象到一块新的内存空间上,旧内存空间的引用计数不会变化,新的内存空间的引用计数由0增加到1。copy分为浅拷贝和深拷贝。浅拷贝只是拷贝地址,和retain等同,不会开辟新的内存空间。深拷贝是对容器来说的,如数组类,字典类,集合类(包括可变与不可变)。举例说明:一个数组对象,普通的深拷贝会开辟一块新的内存空间来存放这个对象,但是这个数组对象里面的各个元素的地址却没有改变,只是retain或者浅拷贝而已,即数组元素没有开辟新的内存空间。真正的深拷贝不但数组对象本身进行了深拷贝,而且连数组元素都进行的深拷贝,即为各个元素开辟了新的内存空间。