内存管理初期
来源:互联网 发布:排华法案 知乎 编辑:程序博客网 时间:2024/04/28 09:43
一.
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的细节。
- 内存管理初期
- 内核初期内存分配器--memblock
- 初期
- ERP系统上线初期怎样加强仓库管理
- 浅谈ERP上线初期如何加强仓库管理
- Oracle教育管理平台PL-SQL脚本之初期设计
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- CodeForces 44D-C - Hyperdrive-暴力
- 《JavaScript高级程序设计(第3版)》读书笔记(二)
- android Picker选择器
- Android——使用HttpClient的HttpGet和Post方式进行网络通信
- iOS之UI初级---UIWindow的基本内容
- 内存管理初期
- 杭电ACM1712(分组背包)
- Android:线性布局(LinearFrame)例子
- NSObject 内省方法
- 漫谈机器学习经典算法—理解EM算法
- java中String类常用方法总结
- IPv4套接字地址结构
- Android网络优化6--写一个网络请求模板2--基于Volley
- python NLTK环境搭建