OC内存管理

来源:互联网 发布:传媒大学网络教育 编辑:程序博客网 时间:2024/06/05 12:46

OC提供了两种内存管理机制:MRC和ARC,虽然现在不需要用MRC去管理内存了,实际开发中强烈推荐使用ARC,但是通过学习MRC可以更深入了解内存管理机制。

先来了解几个概念:

1.堆和栈【我们都知道在数据结构中也有堆和栈的概念,但是它们和操作系统不同】

1.1栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存,它们通常是被调用时处于存储空间中,调用完毕立即释放。

1.2堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。堆是存放在二级缓存中。

1.3栈(数据结构):先进后出,后进先出的数据结构

1.4堆(数据结构):堆排序,可看成一棵树


2.僵尸对象、野指针、空指针

2.1僵尸对象【已经被销毁的对象】

2.2野指针【指向僵尸对象,给野指针发消息会报EXC_BAD_ACCESS的错误】

2.3空指针【没有指向存储空间的指针,给空指针发消息是没有任何反应的,为了避免野指针错误的常见办法,是在对象被销毁之后将指向对象的指针变为空指针】


3.OC内存管理【分配内存和清除内存】

3.1管理范围是任何继承了NSObject的对象,对其他非对象类型无效【因为OC对象存放在堆里面,其他非对象类型一般放在栈里面,栈内存会被系统自动回收】

正式学一下MRC和ARC

4.MRC手动管理内存

4.1引用计数器【任何一个对象,刚创建的时候,引用计数都为1;当没有任何人使用这个对象时,也就是引用计数为0的时候,系统才会回收这个对象】

4.2引用计数器的操作【给对象发送一条retain消息,引用计数器值+1;给对象发送一条release消息,引用计数器值-1;给对象发送retainCount消息,可以获得当前的引用计数器值,但有时候会不准确,建议采用delloc方法来验证是否完全内存释放,注意release并不代表销毁/回收对象,仅仅是引用计数器值-1】

4.3dealloc方法【对象即将被销毁时,系统会自动给对象发送一条dealloc消息,因此从dealloc方法有没有被调用可以判断出对象是否被销毁;注意不能直接调用dealloc方法,因为一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃】

4.4dealloc方法的重写【一旦重写了dealloc方法,就必须在最后调用[super dealloc]】

4.5内存管理规则【有加就有减,可重写dealloc方法来检查内存是否完全释放】

1)谁创建谁release

2)只要你调用了retain,就必须调用一次release

4.6循环引用【当使用@property属性声明两个对象时,如果同时使用retain,会导致相互引用,内存不会释放,解决办法是一个用retain,一个用assign】

4.7autoreleasepool自动释放池【是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次ralease操作】

5.ARC自动引用计数管理内存

5.1

1)ARC是编译器特性,不是运行时特性

2)ARC不允许调用对象的release方法,并且重写父类的dealloc方法时,不能再调用[super dealloc];

3)完全消除了手动管理内存的繁琐,基本上能够避免内存泄露

4)与MRC一样,当两个对象相互引用时,会出现内存泄露的问题,解决办法是一个用strong,一个用weak






1 0
原创粉丝点击