内存管理方式
1.垃圾回收机制(Garbage Collection)有系统管理内存,开发人员不需要管理
2.oc从2.0以后,就开始之初垃圾回收机制,但是用于oc开发(苹果电脑的操作系统),我们的ios平台是不支持垃圾回收机制
不支持垃圾回收机制,oc是如何管理内存的呢?
内存不释放就叫内存泄露,oc通过引用计数器管理内存
根据照明设备所做的动作分析:
(1)图中的行为 开灯 需要照明 不需要照明 关灯
(2)对象的操作 生成对象 持有对象 释放对象 对象销毁
(3)oc中的方法 alloc/copy/new retain release/autorelease
dealloc
3.图中需要照明的人数就代表引用计数
(1)当第一个人需要照明时,引用计数 +1 0
—>1
(2)当第二个人需要照明时,引用计数 +1 1
—
>2
(3)当第三个人需要照明时,引用计数 +1 2
—
>3
(4)当有一个人不需要照明,引用计数 -1 3
—
>2
(5)当再有一个人不需要照明,引用计数-1 2
—
>1
(6)当再由一个人不需要照明,引用计数-1 1
—
>0
4.ios平台下使用引用器如何管理内存,有两种方式
(1)MRC:(Manual Reference Count)手动引用计数,有开发人员通过手动引用计数器来管理内存
(2)ARC:(Automatic Reference Count)自动引用计数,有系统通过引用计数管理内存
5.学习好MRC是为了更好地使用ARC,ios5.0以后就有了ARC
ARC和MRC
(1)如果工程环境是ARC,而部分文件使用了MRC,使用一个参数-fno-objc-arc
(2)如果工程环境MRC,而部分文件使用了ARC,使用一个参数-fobjc-arc
6.自己创建的对象自己持有
Person *p= [[Person alloc]init]; alloc会造成对象的引用计数由0-->1
7.如何判断一个对象是否被持有,就看他的引用计数判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。
retainCount:对象的引用计数
NSLog(@"%lu",p.retainCount);
8.如果自己创建的对象不使用时,释放对象使用release
[p release];//1-->0
[p retain];不能使用[p retaion]让僵尸对象起死复生。
[p release];
不要过度释放,过度释放,也等于操作僵尸对象
9.retain可以让对象的引用计数加1
非自己创建的对象,自己也能持有
10.方法的基本使用
(1)retain 造成引用计数加1,会返回对象本身
(2)release 造成引用计数减1,没有返回值
(3)retainCount的作用:获取当前对象的计数值
(4)当一个对象被销毁的时候,系统自动调用,在此方法中一定要调用[super delloc]这句话要放到最后
11.概念:
野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。
僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测)
空指针:没有指向任何东西的指针(存储的东西是