在正式写博客之前,已经把OC基础的部分过了一遍,整体感觉,c和OC还是挺像的,只不过OC有了面向对象这一部分。不过这也不能抵消掉它的执行效率,因为她是在C基础上发展的,所以她的效率应该是很高的。不像JAVA,虽然它可以跨平台,但是这样做毕竟要以牺牲效率为代价。
现在我们进入正题--内存管理
一为什么要进入内存管理?
1)移动设备的内存极其有限,每个app所能占用的内存是有限制的 。不要说是移动APP要进行内存管理,就是在电脑也需要管理,毕竟内存资源有限啊。
2)如果不进行内存管理,那么app占用内存过大,系统可能会强制关闭app, 造成闪退现象, 影响用户体验。
3)如果不进行内存管理,有可能会面临内存泄漏的问题,其它这在C语言中非常常见,alloc,realloc时,用过之后就是忘了free
二 内存管理涉及的操作
OC内存管理主要是对继承NSOobject 类的对象的管理,基本数据类型是不需要我们进行管理,它由系统进行管理
说到这里就不得不说一下,程序的五个部分,栈区,堆区,NSS区,数据区和代码区,
如图,除了第二部分,其它部分都是不需要我们自己管理 的。因为我们要分配对象,而对象分配的空间都是在堆区,这也好比我们在C语言中分配空间时一样,它也在堆区中分配。
四 oc内存管理原理
OC对对象进行管理 是通过一个引用计数器来进行管理的。当一个对象增加一个所有者,那么它的引用计数器加一,当一个对象减少一个所有者时,它的引用计数器减一,当引用计数器为0时,就要发送dealloc消息,它就要被给release掉(当然如果在创建对象时,没有给它分配空间,虽然它的retainCount ( - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE) 是0 ,但不能对他进行释放操作),在OC里面引用计数器是一个 每个对象都有的占用8个字节的retainCount变量。
五 OC内存管理的分类
oc提供三种内存管理的方式
1)MaunualReference Counting( 简称MRC )手动引用计数
2)AutomaticReference Counting(简称ARC) 自动引用计数
IOS是不支持垃圾回收的,在实际开发项目过程中,我们要用ARC,而我们学习MRC就是为了更好 的了解一OC的内存管理机制。以方便我们后来的项目开发。
六 OC内存管理的原则
1)只要对象还被使用,就不能被释放
2)如果一个人想使用这个对象,那么就应该让对象的retainCount 加1
3)如果一个人不想使用这个对象,那么 就应该让对象的retainContt减1
4)坚持谁创建,谁就release
5) 坚持谁retain,谁release
七 OC内存管理研究的内容
1)防止使用野指针,也是XCODE里面说的僵尸指针,可以类比C语言没有指向的指针
它分两种情况,一种是创建它时就没有创建空间 二是创建之后,它的空间又被释放掉了
2)防止内存泄漏
这个应该是个严重的问题,memory leak 的话,系统会认为你一直在使用着,导致这块区域不能再被释放,除非重做系统。