内存管理器
一、手动计数器(MRC)
1.引用计数
1)每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器。每个引入计数器占四个字节。
2)当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象。
3)使用完毕之后,将该对象的引用计数器值减1,表示该对象已经使用完毕。
4)如果引用计数器值为0时,表明没有地方再使用该对象,这时系统将销毁该对象,其所占用的内存被收回,以便重用。
2.引用计数器的操作
1)引用计数加1的有alloc、new、copy、retain四种。引用计数减1的是release。
2)引用计数是判断这个对象是否被销毁的依据。
3)为什么要使用retain? 因为为了防止对象被销毁(引用计数为0的时候被销毁)。
4)销毁对象的时候会调用delloc方法。delloc不可以直接调用,它是系统自动调用的。什么时候调用delloc?当引用计数为0的时候就会调用delloc方法。
5)a.对象的引用计数为0(对象已经被销毁的时候),对象是一个野指针(没有指向任何东西的指针);
野指针:指向僵尸对象(不可用内存)的指针
b. 使用这个野指针再去调用方法或者其他操作会直接崩溃或者存在潜在危险;
c.如果对象的引用计数为0 就不要强制给这个对象 retain。
6)不用咱们管理引用计数的
a.分配在栈里面的基本数据类型;
b.alloc new copy retain;
c. 以上这些操作都不用咱们管理引用计数;
d.谁分配 谁释放。
7)autorelease 延迟释放
a.经常和自动释放池 配合使用
b.NSAutoreleasePool 自动释放池的类
c.也需要对自动释放池 实例化的对象 release
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
8) 当不知道 什么时候对象不再需要使用 可以使用autorelease 延迟释放,放到自动释放池里面。
Person *对象名 = [[[Person alloc]init]autorelease];
在自动释放池生命周期结束的时候会触发autorelease 释放延迟释放的对象
9)新写法 @autorepleasepool的生命周期
出了花括号自动释放池结束会触发花括号里面所有的autorelease
@autoreleasepool {
Person *liHua = [[[Person alloc]init]autorelease];
}