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消息。