OC内存管理
2015-12-24 17:10
274 查看
OC提供了两种内存管理机制:MRC和ARC,虽然现在不需要用MRC去管理内存了,实际开发中强烈推荐使用ARC,但是通过学习MRC可以更深入了解内存管理机制。
先来了解几个概念:
1.堆和栈【我们都知道在数据结构中也有堆和栈的概念,但是它们和操作系统不同】
1.1栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存,它们通常是被调用时处于存储空间中,调用完毕立即释放。
1.2堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。堆是存放在二级缓存中。
1.3栈(数据结构):先进后出,后进先出的数据结构
1.4堆(数据结构):堆排序,可看成一棵树
2.僵尸对象、野指针、空指针
2.1僵尸对象【已经被销毁的对象】
2.2野指针【指向僵尸对象,给野指针发消息会报EXC_BAD_ACCESS的错误】
2.3空指针【没有指向存储空间的指针,给空指针发消息是没有任何反应的,为了避免野指针错误的常见办法,是在对象被销毁之后将指向对象的指针变为空指针】
3.OC内存管理【分配内存和清除内存】
3.1管理范围是任何继承了NSObject的对象,对其他非对象类型无效【因为OC对象存放在堆里面,其他非对象类型一般放在栈里面,栈内存会被系统自动回收】
正式学一下MRC和ARC
4.MRC手动管理内存
4.1引用计数器【任何一个对象,刚创建的时候,引用计数都为1;当没有任何人使用这个对象时,也就是引用计数为0的时候,系统才会回收这个对象】
4.2引用计数器的操作【给对象发送一条retain消息,引用计数器值+1;给对象发送一条release消息,引用计数器值-1;给对象发送retainCount消息,可以获得当前的引用计数器值,但有时候会不准确,建议采用delloc方法来验证是否完全内存释放,注意release并不代表销毁/回收对象,仅仅是引用计数器值-1】
4.3dealloc方法【对象即将被销毁时,系统会自动给对象发送一条dealloc消息,因此从dealloc方法有没有被调用可以判断出对象是否被销毁;注意不能直接调用dealloc方法,因为一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃】
4.4dealloc方法的重写【一旦重写了dealloc方法,就必须在最后调用[super dealloc]】
4.5内存管理规则【有加就有减,可重写dealloc方法来检查内存是否完全释放】
1)谁创建谁release
2)只要你调用了retain,就必须调用一次release
4.6循环引用【当使用@property属性声明两个对象时,如果同时使用retain,会导致相互引用,内存不会释放,解决办法是一个用retain,一个用assign】
4.7autoreleasepool自动释放池【是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次ralease操作】
5.ARC自动引用计数管理内存
5.1
1)ARC是编译器特性,不是运行时特性
2)ARC不允许调用对象的release方法,并且重写父类的dealloc方法时,不能再调用[super dealloc];
3)完全消除了手动管理内存的繁琐,基本上能够避免内存泄露
4)与MRC一样,当两个对象相互引用时,会出现内存泄露的问题,解决办法是一个用strong,一个用weak
先来了解几个概念:
1.堆和栈【我们都知道在数据结构中也有堆和栈的概念,但是它们和操作系统不同】
1.1栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存,它们通常是被调用时处于存储空间中,调用完毕立即释放。
1.2堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。堆是存放在二级缓存中。
1.3栈(数据结构):先进后出,后进先出的数据结构
1.4堆(数据结构):堆排序,可看成一棵树
2.僵尸对象、野指针、空指针
2.1僵尸对象【已经被销毁的对象】
2.2野指针【指向僵尸对象,给野指针发消息会报EXC_BAD_ACCESS的错误】
2.3空指针【没有指向存储空间的指针,给空指针发消息是没有任何反应的,为了避免野指针错误的常见办法,是在对象被销毁之后将指向对象的指针变为空指针】
3.OC内存管理【分配内存和清除内存】
3.1管理范围是任何继承了NSObject的对象,对其他非对象类型无效【因为OC对象存放在堆里面,其他非对象类型一般放在栈里面,栈内存会被系统自动回收】
正式学一下MRC和ARC
4.MRC手动管理内存
4.1引用计数器【任何一个对象,刚创建的时候,引用计数都为1;当没有任何人使用这个对象时,也就是引用计数为0的时候,系统才会回收这个对象】
4.2引用计数器的操作【给对象发送一条retain消息,引用计数器值+1;给对象发送一条release消息,引用计数器值-1;给对象发送retainCount消息,可以获得当前的引用计数器值,但有时候会不准确,建议采用delloc方法来验证是否完全内存释放,注意release并不代表销毁/回收对象,仅仅是引用计数器值-1】
4.3dealloc方法【对象即将被销毁时,系统会自动给对象发送一条dealloc消息,因此从dealloc方法有没有被调用可以判断出对象是否被销毁;注意不能直接调用dealloc方法,因为一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃】
4.4dealloc方法的重写【一旦重写了dealloc方法,就必须在最后调用[super dealloc]】
4.5内存管理规则【有加就有减,可重写dealloc方法来检查内存是否完全释放】
1)谁创建谁release
2)只要你调用了retain,就必须调用一次release
4.6循环引用【当使用@property属性声明两个对象时,如果同时使用retain,会导致相互引用,内存不会释放,解决办法是一个用retain,一个用assign】
4.7autoreleasepool自动释放池【是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次ralease操作】
5.ARC自动引用计数管理内存
5.1
1)ARC是编译器特性,不是运行时特性
2)ARC不允许调用对象的release方法,并且重写父类的dealloc方法时,不能再调用[super dealloc];
3)完全消除了手动管理内存的繁琐,基本上能够避免内存泄露
4)与MRC一样,当两个对象相互引用时,会出现内存泄露的问题,解决办法是一个用strong,一个用weak
相关文章推荐
- Workerman 一款纯PHP开发的开源高性能的PHP socket 服务器框架。
- 仿微信中加载网页时带线行进度条的WebView的实现
- Android获取经度和纬度
- Angular.js入门的样例
- case when then else end 使用
- 打印sql
- 第十三章_异步处理
- Zookeeper使用场景
- ALSA声卡驱动中的DAPM详解之一:kcontrol
- Java中遍历Map的两种方法:keySet和entrySet
- IIS 7上部署PHP
- Android开发官方文档---Managing Audio Playback
- SQL语句判断数据库、表、字段是否存在
- RadPivotFieldList 如何给 choose fields 分组/层次显示
- sublime text 快捷键注释、批量注释失效
- Eclipse 快捷键 自动生成get/set注释(转)
- 直接执行sql字符串
- 线程日志的分析(摘录)
- 【C】利用strlen实现endwiths函数
- 使用mutt+msmtp做linux邮件客户端