1.为什么要进行内存管理?
由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息。收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃。
这里首先要解释一个常识概念:内存,存储空间,各自的功能?
内存:我们一般说的手机内存其实是指运行内存,,简称运存,即 RAM-全称是RamdomAccessMemory:随机存取存储器
RAM 的大小直接决定手机后台能开多少程序,能运行多少软件,RAM越大,就表示可以运行的软件就越多
存储空间:存储空间就是下载的软件或各种文件的容器,即ROM-全称是Read Only Memory:只读存储器
ROM的大小决定了手机能装多少软件存多少文件,歌曲,电影,小说等..
所以我们知道,手机内存是很小的,一个APP运行如果占用过多内存,苹果规定如果单个APP运行内存超过20M,就会报内存警告,所以必须对内存进行管理,否则会引起程序崩溃
软件被强制闪退,关闭
2.OC 内存管理的范围:
OC管理所有继承自NSObject类的对象,不去管理其他基本数据类型的对象,(只针对堆区)
为什么?
本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指 向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄 露。
通俗讲就是:栈区存的是一些基本类型的局部变量,指针变量也是局部变量,这些变量在程序结束会自动被系统回收,
但堆区是不会被系统管理的,如果我们也不去管理,就像永远不清理的垃圾,越来越多,占着内存空间,就相当于你有100块钱,被偷了50块,也就是内存泄漏的概念了
这里又想到一个小的概念:
为什么定义堆区时说堆区是程序运行过程中动态分配的内存空间?
可以想一下,堆区是存储对象的,而只有创建对象时调用类方法alloc时才会在堆区申请内存空间,所以显而易见堆区就是只有当实例化对象时才会被分配内存空间
显而易见:定义油然而生
3.内存管理的原理和分类:
3.1引用计数器
引用计数器是一个整数,是用来计算对象被引用的次数的
对象创建时向计算机申请了一块内存空间,并在这一块内存空间中分出了一个8个字节的空间用来存放引用计数器
3.2对引用计数器的操作
给对象发送消息,进行相应的计数器操作。
retain消息:使计数器+1,该方法返回对象本身
release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值%lu %tu
作用就是给对象发消息(每天干的活)
又想到一个小概念:
我们玩苹果手机时通常会按home键,让程序"看似退出",但实际上程序只是放在后台运行了,并没有退出,怎么看到后台程序呢?双击home键即可看到
所以程序退出(双击home键,按住应用程序往上滑),但有个问题微信,qq,我让程序退出后还是能够接受消息,这是不是说明程序在后台是运行着呢?并
没有退出,但我明明已经双击home把程序滑退了啊,这个怎么解释呢?
其实,程序确实是退出了,这些消息其实就是推送消息,而推送消息是由苹果的服务器推送给你的,并不是APP推送的,(这项技术成为手机推送开发技术)
应该是涉及服务器和数据库的,这也是学习iOS的弊端,好多都不能深入了解,要想清楚,还是要往全栈上发展和努力.
Objective-C提供了三种内存管理方式:
MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要
自己负责使用引用计数来管理内存,比如要手动 retain、release、autorelease 等,而在其后
的版本可以使用 ARC,让系统自己管理内存。)
automatic reference counting(ARC,自动引用计数,iOS4.1 之后推出的)
garbage collection(垃圾回收)。iOS不支持垃圾回收;
ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
开发中如何使用:需要理解MRC,但实际使用时尽量用ARC
4.MRC(手动内存管理)