iOS基础 ----- 内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS基础 ----- 内存管理相关的知识,希望对你有一定的参考价值。

  Objective-C 的内存管理方式有引用计数机制,垃圾回收机制,自动释放池。有alloc,就有释放。ios应?程序出现Crash(闪退),90%的原因是因为内存问 题。在?个拥有数?个甚?是上百个类的?程?,查找内存问 题极其困难,学会内存管理,能帮我们减少出错的?率。内存问题体现在两个??:内存溢出、野指针异常。

引用计数器

  在Xcode4.2及之后的版本中由于引入了ARC(Automatic Reference Counting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代码,如果编写手动释放代码Xcode会报错,因此在今天的内容中如果你使用的是Xcode4.2之后的版本(相信现在大部分朋友用的版本都比这个要高),必须手动关闭ARC,这样才有助于你理解ObjC的内存回收机制。ObjC中的内存管理机制跟C语言中指针的内容是同样重要的,要开发一个程序并不难,但是优秀的程序则更测重于内存管理,它们往往占用内存更少,运行更加流畅。虽然在新版Xcode引入了ARC,但是很多时候它并不能完全解决你的问题。在Xcode中关闭ARC:项目属性—Build Settings--搜索“garbage”找到Objective-C Automatic Reference Counting设置为No即可。

 引用计数又分ARC(Auto Reference Counting) 自动引用计数 和 MRC(Manual Reference Counting) 人工引用计数。

 自动引用计数:iOS 5.0的编译器特 性,它允许?户只开辟空间,不?去释放空间。它不是垃圾回 收!它的本质还是MRC,只是编译器帮程序员默认加了释放的 代码。

 内存的开辟和释放 都由程序代码进?控制。相对垃圾回收来说,对内存的控制更 加灵活,可以在需要释放的时候及时释放,对程序员的要求较 ?,程序员要熟悉内存管理的机制。

 垃圾回收机制  

   程序员只需要开辟内存空间,不需要?代码的 形式释放,系统来判断哪些空间不再被使?,并回收这些内存 空间,以便再次分配。整个回收的过程不需要写任何代码,由 系统?动完成垃圾回收。Ja─a开发中?直使?的就是垃圾回收 技术。

 

 

    OC采?引?计数机制管理内存,每个对象都有?个引? 计数器,?来记录当前对象的引?次数。 当?个新的引?指向对象时,引?计数器就加1,当去掉 ?个引?时,引?计数就减1。当引?计数到零时,该对 象的空间就被系统回收。 retainCount获取对象的引?计数。

 例如,厕所进去一个人,引用计数就要加1,出来一个人就要减1,等人全部出来后就变成了0,相当于释放掉了,被系统回收了。

 

影响引用计数的方法

1、 + alloc 开辟内存空间,让被开辟的内存空间的引?计数 从0变为1。

2、 - retain 引?计数加1,如果对象之前引?计数为1,retain 之后变为2,如果引?计数是5,retain 之后变为6。

3、 - copy 把某?对象的内容拷贝?份,拷贝出新的对象, 原有对象的引?计数不变,新的对象的引?计数变1。

 

释放内存

iOS5之前,使? NSAutoreleasePool ?动释放池类创建对象。

iOS5之后,不再推荐使? NSAutoreleasePool 类,使? @autoreleasepool{}替代。

出了大括号,自动释放池才向各个对象发送release消息。

以上是关于iOS基础 ----- 内存管理的主要内容,如果未能解决你的问题,请参考以下文章

iOS 内存管理

iOS内存管理机制解析之MRC手动引用计数机制

iOS学习之内存管理

IOS内存管理

iOS之深入解析内存管理的引用计数retainCount的底层原理

iOS内存管理理论知识过一遍