您的位置:首页 > 移动开发 > Objective-C

Objective-C----内存管理

2016-04-20 15:48 344 查看
简述OC中内存管理机制

1、OC的内存管理机制是自动引用计数,内存管理的原则是谁开辟谁释放,有retain的地方就要有release

2、内存管理分为ARC和MRC,ARC下则一般不需要我们手动管理,系统会在适当的位置加上内存管理关键字。在MRC下我们需要手动管理内存,需要使用到retain/copy/release/autorelease等方法实现内存管理。具体如下:

(1)如果使用 alloc、copy(mutableCopy)或retian 一个对象时,你就有义务,向它发送一条 release或 autorelease 消息。

(2)向一个对象发送一条 autorelease 消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条 release 消息,以此来释放对象。

(3)向一个对象发送 release 消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为 0 时,系统才会调用 dealloc 方法,释放该对象和对象 本身它所拥有的实例。

3、retain是引用计数+1, 在内存管理中, 要记得内存管理原则: 谁开辟谁释放, 有retain就要有release. release是引用计数-1. alloc匹配的是dealloc, alloc是开辟内存空间, dealloc是销毁所开辟的内存, 有开辟就要有销毁.
-------------------------------------------------------------------------------------------------------------------

下面是对内存、引用计数等概念的介绍


内存简介:
iOS系统给每个运行的软件一块内存空间(虚拟空间)。应用程序使用内存超过这个内存空间,程序就会被系统主动关闭。

为什么要使用内存管理?

应用程序崩溃,%90以上的bug都是内存问题引起的。理解内存管理的原则,能够减少我们程序出错的机率
出现内存问题主要有两个方面:

1、内存溢出

概念:iOS给每个应用程序提供了一定的内存,iPhone 3GS的内存30M左右,iPhone
5S的内存80M左右,一旦超出内存上限,程序就会被crash(崩溃,闪退)

程序开发过程中最占用内存资源的是图片,音频,视频等资源文件。3.5寸非Retina屏幕的像素是320 * 480,而一张全屏的图片所占用的内存是(320 * 480 *4 = 614400字节
614400字节/1024 = 600KB
)(一个像素占4个字节,存放RGBA),那么同时读取30张图片就会崩溃。
3.5寸Retina屏幕的像素是320
* 2 * 480 * 2
一张全屏图片所占内存空间,320 * 2 * 480 * 2 * 4 = 2457600 2.4M

内存溢出也就是超出了给你限定的内存区域导致的问题,就跟容器装水一样,超出容器的水就会溢出

2、野指针
对象的内存空间已经被系统回收,荏苒使用使用指针操作这块内存。野指针操作是允许程序Crash的主要原因。代码量越大,越难找出野指针的位置。

了解内存管理能帮我们提升程序的性能,减少bug调试时间

[b]如何管理内存[/b]
解决方案:对象有创建就要有销毁
所谓的内存管理就是对对象的创建和销毁过程进行管理
内存管理的方式

1、垃圾回收机制GC:
(Java、C#、C++、OC(只支持Mac
OS;apple移动手机端没有))有垃圾回收机制;

程序猿只需要开辟空间,不需要用代码进行释放,系统来判断那些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,由系统自动完成垃圾回收。 --- Java一直使用的便是垃圾回收机制

2、手动管理内存:MRC (Manual Reference Count)手动引用计数

内存的开辟和释放都由出现的代码控制。相对垃圾回收机制,MRC堆内存的控制更加灵活,可以在需要释放的时候及时释放,对程序猿要求较高,程序猿需要熟悉内存管理机制。

3、自动管理内存

ARC:(Auto
Reference Count)自动引用计数
;ARC是iOS5之后的新特性,并不是垃圾回收

iOS 5.0的新特性编译器,它只允许用户开辟空间,不用去释放空间。它不是垃圾回收,它的本质还是MRC,只是编译器帮程序猿默认添加了释放的代码。

iOS的内存管理

iOS支持三种内存管理方式,MRC,ARC,垃圾回收(Mac
OS);

MRC的内存管理机制是ARC引用计数机制。

ARC是基于MRC的;
[b]内存管理机制[/b]

引用计数
OC采用的“引用计数机制”管理对象所占用得内存
实际开发中,经常遇到多个指针使用同一块内存地址的情况。C语言无法记录内存使用者的个数
计数:计数器用于统计数字:0,1,2,3,4,5………………
引用计数:记录某一块内存区域,拥有这块内存区域拥有者(owner)的个数

拥有者(owner):使用这块区域的对象就叫做拥有者

NSObject类及其子类都有一个属性,用来记录当前对象的引用计数
OC采用引用计数机制管理内存,当一个新的引用指向对象时,引用计数器就+1,当不再使用的时候,引用计数就-1;当引用计数为0的时候,该对象将释放所占有的资源。

生命周期

实例对象的生命周期:生成于alloc方法 结束于dealloc方法

通过对类发送alloc消息获得的实例对象的引用计数赋值

1。当实例对象引用计数为0的时候,这都给该对象发送dealloc消息

[b]影响引用计数的方法[/b]
alloc:开辟内存空间,让被开辟的内存空间的引用计数变为1,这是从0到1得过程
retain:“持有”,对象的引用计数+
1,拥有该对象的所有权。如果对象原来引用计数为1,那么引用计数是2,如果引用实现是5,retain之后遍6

copy:把某一块内存区域的内容拷贝一份,拷贝到新的内存空间里去,被拷贝的对象的引用计数不变,新的内存区域的引用计数变为1,拥有新的被copy出来的对象的所有权

release:引用计数减1,并释放对象的所有权,如果之前引用计数为4,release之后引用计数变成3
autorelease:
dealloc

是继承(NSObject)的方法,当对象的引用计数为0时,系统就使用该对象调用dea
lloc方法[b]。[/b]

自动释放池
NSAutoreleasePool类

当你创建对象,不想立即释放的时候可以使用NSAutoreleasePool,那么会把对象所有权交给最近的NSAutoreleasePool对象

autoreleasePool控制使用autorelease对象的释放。

这个对象合适释放,取决于这个autoreleasePool

copy
想要copy一个对象,也就是生成一个副本。想要先遵循NSCoping协议,NSCoping协议中,有一个必须实现的协议方法,如果没有遵循NSCoping协议,或者没有实现里边的协议方法,就会导致崩溃,我们需要在copyWithZone方法中,定义copy的细节实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: