内存管理
来源:互联网 发布:徐州专业淘宝摄影 编辑:程序博客网 时间:2024/05/16 09:25
内存管理介绍:
比如职务大战僵尸的游戏或者开心消消乐,每一个僵尸在程序中就是一个对象,每一个方块也就是一个对象,既然对象系统就会自动分配内存(对内存)
那么死去的僵尸和消除的方块应该如何处理
iOS系统会给每一个运行的软件一块内存空间
应用程序使用内存超过这个内存空间,程序就会被系统主动关闭
为什么要使用内存管理?
应用程序崩溃90%以上的bug都是内存问题引起的,了解内存管理的原则,能够减少我们程序出错的几率
出现内存问题一般有来个方面:
1.内存溢出
2.野指针访问
内存溢出:iOS给每个应用程序提供了一定的内存,iPhone3gs系统分配了30m的内存,一旦超出内存上限,程序就会crash(崩溃,闪退)
程序开发过程中最占内存资源的事图片/音频/视频等资源文件
3.5寸非Retina屏幕,他的像素是320*480,而一张全屏的图片所占的内存(320*480*4=614400/1024=600kb)(一个像素占4个字节,存放rgba)那么同时读取30m的图片就会崩溃
3.5寸Retina屏幕 640*960
一张图片所占内存空间640*960*4=2457600/1024=2400kb
内存溢出也就是超出了给你限定的内存区域导致的问题,就跟用容器装水一样,超出了容器水就会溢出
野指针的异常:
对象的内存空间已经被系统回收,仍然使用指针操作这块内存,野指针操作引起程序crash的主要原因,代码量越大就越难找出野指针的位置
了解内存管理能够帮我们提升程序的性能,减少bug调试时间
那么我们如何管理内存
有创建就要有销毁(谁创建,谁销毁)
所谓内存管理就是对对象的创建和销毁过程进行管理
内存管理方式:
垃圾回收(java c#,c++,oc(只支持mac os)
手动管理内存()
c语言:malloc和free
oc:MRC(manual reference count)手动引用 计数
自动清理内存ARC(auto reference count)自动 引用 计数,iOS5之后的新特性,并不是垃圾回收机制
垃圾回收机制
程序员只需要开辟空间,不需要用代码进行释放,由系统来判断哪些空间不再被使用,并回收这些内存空间,以后再次分配。整个回收的过程中不需要在写任何代码,由系统自动完成垃圾回收,java开发中一直使用这种垃圾回收机制
MRC,人工手动引用记数,内存的开辟和释放都有程序的代码控制,相对于垃圾回收机制,MRC对内存的控制更加灵活,在需要时释放的时候及时释放。对程序员要求较高,需要熟悉内存管理机制
ARC:
自动引用计数:iOS5的编译器的新特性,只允许用户开辟空间,不用去释放空间,他不是垃圾回收机制,他的本质还是MRC,只是编译器棒程序猿默认加入了释放的代码
iOS内存管理
iOS支持三种内存管理方式:MRC,ARC,垃圾回收(Max os)
MRC的内存管理机制是引用记数机制
ARC是基于MRC
********************
二:内存管理机制
引用计数:oc采用“引用计数机制”管理对象所占内存
实际开发中会遇到多个指针使用同一块地址的情况,c语言无法记录内存使用者的个数
计数:用于统计数字
引用计数:某一块内存,拥有这块内存的拥有者个数(owner):使用这块内存区域的对象就叫拥有者
注意:nsobject类以及子类都有一个属性,用来打印当前对象的引用计数
OC采用引用计数机制管理内存,当一个新的引用指向对象是,引用计数器就+1,当不再使用的时候,引用计数就减一。
当引用计数为0的时候,该对象将释放所占有的资源。
三:生命周期
实例对象的生命周期
出生于:alloc
死亡与:dealloc
通过对类发送alloc消息获得实例对象的引用计数赋值为1;
当实列对象引用计数为0的时候,自动对该对象发送dealloc消息
影响引用计数的方法:(+类方法 - 实列对象方法)
+alloc 开辟内存空间,让被开辟的内存空间的引用计数变为1 从0到1
-retain ”持有“对象引用计数+1,拥有该对象的所有权 如果对象引用计数原来是1,那么retain之后,就位2,,,依次+1.。。
-copy 把某一内存区域的内容拷贝一份,拷贝到新的内存空间里去,被拷贝的对象引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来对象的所有权
-release 引用计数-1,并示释放对象的所有权,如果之前,引用计数为4,release之后,引用计数变为3
autorelease 未来的某一时刻引用计数-1;并放弃对象的所有权
/**
dealloc 是继承父类nsbject的方法,当对象的引用计数为0的时候,有系统使用该对象调用dealloc方法,
dealloc 方法我们不要自己调用
*/
/***
//自动释放池
NSAutoreleasePool
当你创建对象不想立刻释放的时候,可以用AutoreleasePool,那么会把对象的所有权交给最近的NSAutoreleasePool对象
AutoreleasePool控制使用Autorelease对象的释放
这个对象何时释放取决于这个AutoreleasePool
/****
//内存管理原则
凡是出现alloc,retain .copy 的地方都应该出现release或者autorelease与之对应 在一段代码,增加和减少的次数要相等
属性为retain、copy的时候,需要在类的dealloc方法中释放
便利构造器本身包含autorelease
***/
/**
四 copy
想要copy一个对象,也就是生成一个副本,需要先遵循NScopying协议,NScopying协议中有一个必须实现的协议方法,如果没有遵循NScopying协议,或者没有实现里面的协议方法,就会导致崩溃,我们需要在copyWithZone:方法中定义copy的实现细节
//当对象执行copy方法是,会执行copyWithZone方法
- (id)copyWithZone:(NSZone *)zone{
//创建一个新的同类型的对象
Person *person=[[Person alloc]init];
//将copy对象的值,赋值给新创建的实列对象,即完成了copy方法
person.name=self.name;
person.sex=self.sex;
return person;
}
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 头文件
- Java反射reflect学习笔记_1:反射的简述
- Fragment和Fragment之间的数据传输
- 字典树的妙用(求单词出现的次数)
- 【UML】用例图
- 内存管理
- 世界顶级黑客技术社区最新名单
- 对于oom(内存溢出),图片加载方面,Dalvik,算法,自定义对内存方面很好的一片文章
- oracle scn和headroom
- Linux下MySQL忘记root密码的解决办法
- 《leetCode》:Ugly Number
- iOS汉字转拼音(NSString+Characters)为NSString添加的类目
- Android Bundle类
- svn 服务器