内存管理初期
2015-11-15 15:44
169 查看
一.
1.游戏中,植物大战僵尸的尸体和开心消消乐的方块都去哪里了?
每一个尸体和方块都是一个对象。既然是对象,系统就会分配内存。应用程序使用内存,超过这个内存空间,程序就会被这个系统主动关闭。
2.为什么要使用内存管理?
应用程序崩溃,90%以上的bug都是内存问题引起的。了解内存管理里,能够减少程序的出错几率。出现内存问题一般有两个方面:
(1)内存溢出 :内存溢出就是超出了给你限定的内存区域导致的问题,就跟用容器装水一样,超出容器的水就会溢出。
(2)野指针访问:对象的内存空间已经被系统收回,仍然使用指针操作这块内存。也指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置。
3.那么我们如何管理内存呢?
解决方案就是有创建就有销毁
所谓的内存管理就是对象的创建和销毁进行管理。
4.内存管理的方式:
(1)垃圾回收(Java,C#,C++,OC(只支持Mac OS))
(2)手动管理内存:
C语言:malloc,freee;
OC:MRC(Manual Reference Count)手动 引用 计数
(3)自动管理内存:
ARC(Auto Reference Count)自动 引用计数 iOS 5之后的新特性,并不是垃圾回收。
4.垃圾回收机制:
程序员只需要开辟内存空间,不需要用代码进行释放,系统来判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,有系统自动完成垃圾回收。Java开发过程就是使用这种垃圾回收机制。
5.MRC:
手动引用计数:
内存的开辟和释放都需要程序的代码控制。相对于垃圾回收机制,MRC对内存的控制更加灵活,可以在需要释放的时候及时释放。对程序要求极高,需要熟悉内存管理机制。
6.ARC:
自动以用机制:至开辟空间,不去释放。他不是垃圾回收机制,它的本质还是MRC,只是便一起帮程序员默认加入了释放的代码。
iOS的内存管理:iOS支持3种内存管理方式:MRC,ARC,垃圾回收(Mac OS).
MRC的内存管理机制是:引用计数机制
ARC是基于MRC的。
二.内存管理机制
引用计数:OC采用“引用计数机制”,管理对象占用内存。实际开发过程中,经常会遇到多个指针使用同一块内存的情况,C语言无法记录内存使用者的个数。
计数:计数器,用于统计数字,例如1,2,3,4,5...等
拥有者(owner):使用这块内存区域的对象叫做这块内存区域的拥有者。
NSObject类及其子类都有一个属性,用来记录当前对象的引用个数
OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就+1,当不再使用的时候,引用计数就-1.当引用计数为0 的时候,该对象将释放所占有的资源。
7.影响引用计数的方法
(1)alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1,这是由0到1的过程。
(2)retain:"持有"的意思。对系那个引用计数+1.拥有该对象的所有权。
(3)copy:把某一内存区域的内容拷贝一份,拷贝到新的内存空间去。被拷贝对象的引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来对象的所有权。
(4)release:引用计数-1,并释放对象的所有权,如果以前引用计数为4,那么release之后引用计数为3.
(5)autorelease:未来的某一时刻-1,并放弃对象所有权。
8.dealloc:是继承父类(NSObject)的方法,当对象的引用计数为0的时候,有系统使用该对象的dealooc方法 dealooc方法我们不要自己调用。
自动释放池
NSAutoreleasePool类
当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近的NSAutoreleasePool对象
sutorleasePool控制,使用autorelease对象的是释放 这个对象何时释放取决于这个autoreasepool
8.内存管理原则:
凡是出现alloc,retain,copy的地方,都应该出现release或者autorelease与之对应
凡是出现了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少。在一块代码内,增加和减少的次数要相等。
9.copy:
想要copy一个对象,也就是生成一个副本,需要先遵循NSCcopying协议,NSCopying协议中有一个必须实现的协议方法。如果没有遵循NSCopying,或者没有实习里面的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节。
1.游戏中,植物大战僵尸的尸体和开心消消乐的方块都去哪里了?
每一个尸体和方块都是一个对象。既然是对象,系统就会分配内存。应用程序使用内存,超过这个内存空间,程序就会被这个系统主动关闭。
2.为什么要使用内存管理?
应用程序崩溃,90%以上的bug都是内存问题引起的。了解内存管理里,能够减少程序的出错几率。出现内存问题一般有两个方面:
(1)内存溢出 :内存溢出就是超出了给你限定的内存区域导致的问题,就跟用容器装水一样,超出容器的水就会溢出。
(2)野指针访问:对象的内存空间已经被系统收回,仍然使用指针操作这块内存。也指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置。
3.那么我们如何管理内存呢?
解决方案就是有创建就有销毁
所谓的内存管理就是对象的创建和销毁进行管理。
4.内存管理的方式:
(1)垃圾回收(Java,C#,C++,OC(只支持Mac OS))
(2)手动管理内存:
C语言:malloc,freee;
OC:MRC(Manual Reference Count)手动 引用 计数
(3)自动管理内存:
ARC(Auto Reference Count)自动 引用计数 iOS 5之后的新特性,并不是垃圾回收。
4.垃圾回收机制:
程序员只需要开辟内存空间,不需要用代码进行释放,系统来判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,有系统自动完成垃圾回收。Java开发过程就是使用这种垃圾回收机制。
5.MRC:
手动引用计数:
内存的开辟和释放都需要程序的代码控制。相对于垃圾回收机制,MRC对内存的控制更加灵活,可以在需要释放的时候及时释放。对程序要求极高,需要熟悉内存管理机制。
6.ARC:
自动以用机制:至开辟空间,不去释放。他不是垃圾回收机制,它的本质还是MRC,只是便一起帮程序员默认加入了释放的代码。
iOS的内存管理:iOS支持3种内存管理方式:MRC,ARC,垃圾回收(Mac OS).
MRC的内存管理机制是:引用计数机制
ARC是基于MRC的。
二.内存管理机制
引用计数:OC采用“引用计数机制”,管理对象占用内存。实际开发过程中,经常会遇到多个指针使用同一块内存的情况,C语言无法记录内存使用者的个数。
计数:计数器,用于统计数字,例如1,2,3,4,5...等
拥有者(owner):使用这块内存区域的对象叫做这块内存区域的拥有者。
NSObject类及其子类都有一个属性,用来记录当前对象的引用个数
OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就+1,当不再使用的时候,引用计数就-1.当引用计数为0 的时候,该对象将释放所占有的资源。
7.影响引用计数的方法
(1)alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1,这是由0到1的过程。
(2)retain:"持有"的意思。对系那个引用计数+1.拥有该对象的所有权。
(3)copy:把某一内存区域的内容拷贝一份,拷贝到新的内存空间去。被拷贝对象的引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来对象的所有权。
(4)release:引用计数-1,并释放对象的所有权,如果以前引用计数为4,那么release之后引用计数为3.
(5)autorelease:未来的某一时刻-1,并放弃对象所有权。
8.dealloc:是继承父类(NSObject)的方法,当对象的引用计数为0的时候,有系统使用该对象的dealooc方法 dealooc方法我们不要自己调用。
自动释放池
NSAutoreleasePool类
当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近的NSAutoreleasePool对象
sutorleasePool控制,使用autorelease对象的是释放 这个对象何时释放取决于这个autoreasepool
8.内存管理原则:
凡是出现alloc,retain,copy的地方,都应该出现release或者autorelease与之对应
凡是出现了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少。在一块代码内,增加和减少的次数要相等。
9.copy:
想要copy一个对象,也就是生成一个副本,需要先遵循NSCcopying协议,NSCopying协议中有一个必须实现的协议方法。如果没有遵循NSCopying,或者没有实习里面的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节。
相关文章推荐
- JAVA总结
- Android——使用HttpClient的HttpGet和Post方式进行网络通信
- 马踏棋盘图形界面版
- markdownpad2使用说明
- Android:match_parent,fill_parent,wrap_content的区别
- 《JavaScript高级程序设计(第3版)》读书笔记(二)
- [转]qt中文乱码问题
- [Android] Android开发优化之——对Bitmap的内存优化
- CodeForces 44H - Phone Number-dp
- 文件下载注意的地方
- 安装sql server2000时提示被挂起
- fedora22下配置hadoop
- [C++] Virtual Destructor(虚析构函数)
- UIView
- Xcode因为证书问题经常报的那些错
- JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
- hdu 2841
- UI框架
- IOS面试题<转>
- 第一个java项目,完!