1.iOS里面有一个经常出现的现象,就是崩溃,也就是闪退,90%以上都是内存原因,
1)内存溢出 2)野指针异常 内存大比较难以发现问题,需要程序员对内存管理有比较好的使用习惯。
2.内存溢出:超出分配内存访问,5s内存50M;6内存限制80M;6s内存限制130M;
3.野指针异常:野外的指针,没有主的,
4.内存问题的解决问题,内存管理:
1)垃圾回收:garbage collection
2)MRC Manule reference count 手动引用计数
3) ARC auto reference count 自动引用计数
5.iOS 没有垃圾回收机制,
(1)安卓(java)用的是垃圾回收 垃圾回收的算法机制有哪些:
(2)引用计数/引用计数的升级/标记删除/标记整理/分代回收 年青代,年老代,持久代,
(3)程序员可以不用考虑对象的内存回收,只需要关心对象之间的关系就行,至于对象的回收,JVM会自动处理,不需要写任何代码
6.MRC,内存的开辟和释放都是程序员释放的,相对于垃圾回收,对内存的控制更灵活,可以在需要的时候进行释放,但是对程序员的要求较高,需要熟悉内存管理机制。
7.ARC
是iOS 5.0引入的新特性,只允许用户开辟空间,不允许释放和修改内存,arc不是垃圾回收,本质上还是MRC,是其的升级版是编译器代替程序员进行内存的释放。
(1)ios 支持MRC和ARC(2)ARC不是垃圾回收,(3)MRC 的机制是引用计数
8.MRC
(1) OC当中采用引用计数,当一个指针指向一个内存的时候,这块内存的引用计数就加1,当一个指针被去掉的时候,引用计数就减1,
(2)当引用计数为0的时候,就回收这块内存(除nil)// 当引用计数为1,还要进行release的时候,就回收这块内存,回收之后,内存之后不变,引用计数依旧为1。//
(3)回收,收回这块内存的使用权限,对内存没有进行任何操作。
(4)MRC实质就是通过一系列函数实现对内存引用计数的管理,
这些函数是:+alloc, -retain, -copy, -release, -autorelease
9. +alloc 类方法,向系统申请一块内存,,让其引用计数从0到1 ;这是唯一一个有0到1的过程,
retainCount 功能是求指针指向的那块内存的引用计数,(nsstring等系统的函数,不要去使用该函数来求取引用计数,当只有一个字母存在栈区,返回的是retaincount 的长整型的最大值,当有多个字母时放在堆区可以计数);
assign的基本数据类型在栈区,其内存释放有系统自动回收,不需要引用计数,
10. -retain 对一块内存的引用计数加1,在MRC下,单纯的多一个指针去指向一块内存,这块内并不存在直接增加他的引用计数,只有上面的几个方法引用计数。
11. -copy 讲目标内存的所有数据拷贝一遍,重新申请一样大小的内存,把数据存进去,新的内存的引用计数置为1,
(1)要想实现copy 必须实现nscopying协议。
- (id)copyWithZone:(NSZone *)zone 根据空间拷贝。
12.release 将目标的内存块的引用计数减1,
//#define SafeFree(p) [p release]; p=nil;// 批量处理释放对象空间。
13 autorelease是一种自动释放的方式,@autoreleasepllo {}
// 自动释放池,会对所有的存在的释放池中的对象进行释放,前提是这个对象被添加了标记。
特点(1)释放的时机,在大括号结束的时候,对所有加标记的对象释放,
(2)自动释放池对于标记对象的存储是用栈结构存储。当自动释放池执行到右括号时,会去栈中挨个取对象,release每个对象。
14 dealloc 会在一个对象呗释放的时候,自动 调用nsobject的dealloc 方法
(1)故不要调用dealloc!!!
(2)当内存快被回收的时候,才会被自动调用。