内存管理入门
1.为什么进行内存管理
移动设备的内存有限,一般在超过20M的时候回告警,45M的时候回再次告警,110M的时候回自动程序崩溃,保证其他程序的正常运行。--------告警是告诉程序回收一些不在使用的对象和变量等,否则程序会崩溃
2.内存管理的范围
内存管理的范围及计数引用
内存管理的范围:
所有继承自NSObject对象的内存管理
对象的所有权及引用计数:
1.一个对象可以有一个或者多个所有者。当该对象的所有者的数目为0的时候,该对象才会被被释放
2.在每个对象的内部,都有一个8个字节的存储空间,该空间用来存储引用计数器retaincount。
3.引用计数器的作用:判断对象要不要回收的依据。如果retaincount是0的话就回收空间。存在一种例外----对象值
为nil时,引用计数为0,但是不回收空间
4.引用计数器的操作
(1)retain消息:使retaincount+1,该方法返回对象本身
(2)release消息:使retaincount-1,
(3)retainCount消息:获得对象当前的引用计数器的值
对象的销毁:
当对象的引用计数器的值为0时,该对象销毁,其占用的内存被系统回收。
当对象被销毁时,系统自动向对象发送一条dealloc消息,释放资源---------一般会重写dealloc方法,但是,重写
dealloc方法必须调用[supser dealloc],并且放在代码块的最后调用
一旦对象被回收,那么他所占据的存储空间不再可用,否则出现野指针错误
内存管理的分类:
1.MannulReference Counting----------MRC(手动管理),与ARC不同的时,空间的回收由程序猿手动回收。
2.automatic reference counting---------ARC(自动管理)
3.garbage collection---------垃圾回收,IOS不支持
指针的内存管理
单个对象野指针问题产生的原因:
代码段:
Dog *byd = [Dog new];//retaincount=1
[byd eat];
[byd release]; //retaincount=0
[byd eat]; //按道理说是不能执行的,引用空间已经被释放了。但是可以运行呢
原因:当rataincount=0的时候,系统释放对象的空间,所谓的释放就是说,其他的对象或者程序可以
使用这些内存。但是如果,没有程序占用这些内存,[byd eat]还是可以使用得(OC并没有那么严谨);
如果一个对象被释放了,但是释放之后,还是被引用了,那么这就是僵尸对象。
解决办法:
开启僵尸对象检测
nil,nil,NULL,NSnull的简单接受
nil----用于对象,如果对象没有被赋值,那么他就是nil。
Nil---给类对象赋值。
NULL----指针为空。
NSnull----适用于不能使用nil的场合,例如数组。
单个对象避免使用僵尸对象的方法:
[d release]; [d release];
d = nil;-------------------相当于 d = nil;
[d eat]; [nil eat];
对nil的任何操作都是无效的。
单个对象内存泄露的情况分析:
1、对象创建完成之后,没有release
2、没有遵守内存管理原则
谁申请的谁release
3、nil的不当使用
Dog *d =[[Dog allloc] init];
d = nil;
[d eat];
[d release];
4、Dog *d =[[Dog allloc] init]
[d method:d];
其中method:d方法中使得d的retain+1;
多对象出现野指针问题的原因分析:
对象A调用对象B的方法,当对象B释放之后,A并没有感知,依旧会调用B的方法,但是B已经不存在了。