您的位置:首页 > 其它

OC9-内存管理

2015-12-15 19:18 141 查看
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)当内存快被回收的时候,才会被自动调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: