iOS内存管理浅析

软件运行时会分配和使用设备的内存资源,所以,在软件开发的过程当中,须要进行内存管理,以保证高效、快速的分配内存,而且在适当的时候释放和回收内存资源。安全

1、Objective-C内存管理的对象

IOS开发中,内存中的对象主要有两类,一类是值类型,好比int、float、struct等基本数据类型,另外一类是引用类型,也就是继承自NSObject类的全部的OC对象。前一种值类型不须要咱们管理,后一种引用类型是须要咱们管理内存的,一旦管理很差,就会产生很是糟糕的后果。多线程

为何值类型不须要管理,而引用类型须要管理呢?那是由于他们分配内存方式不同。框架

值类型会被放入栈中,他们依次紧密排列,在内存中占有一块连续的内存空间,遵循先进后出的原则。引用类型会被放到堆中,当给对象分配内存空间时,会随机的从内存当中开辟空间,对象与对象之间可能会留有不肯定大小的空白空间,所以会产生不少内存碎片,须要咱们管理。性能

栈内存与堆内存从性能上比较,栈内存要优于堆内存,这是由于栈遵循先进后出的原则,所以当数据量过大时,存入栈会明显的下降性能。所以,咱们会把大量的数据存入堆中,而后栈中存放堆的地址,当须要调用数据时,就能够快速的经过栈内的地址找到堆中的数据。atom

值类型和引用类型之间是能够相互转化的,把值类型转化为引用类型的过程叫作装箱,好比把int包装为NSNumber,这个过程会增长程序的运行时间,下降性能。而把引用类型转为值类型的过程叫作拆箱,好比把NSNumer转为float,在拆箱的过程当中,咱们必定要注意数据原有的类型,若是类型错误,可能致使拆箱失败,所以会存在安全性的问题。手动的拆箱和装箱,都会增长程序的运行时间,下降代码可读性,影响性能。spa

在IOS开发过程当中,栈内存中的值类型系统会自动管理,堆内存中的引用类型是须要咱们管理的。每一个OC对象内部都专门有四个字节来存储引用计数器,它是一个整数,表示对象被引用的次数,经过它能够判断对象是否被回收,若是引用计数为0,对象回收,不为0不回收。当对象执行alloc、new或者retain时,引用计数加1,release时,引用计数减1。线程

2、Objective-C管理内存的方式

Objective-c中提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来知足不一样的需求。MRC与ARC区别以下图所示。指针

IOS 内存管理

1.MRC(人工引用计数),手动管理内存。

MRC模式下,全部的对象都须要手动的添加retain、release代码来管理内存。使用MRC,须要遵照谁建立,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。对象

当引用计数为0的时候,必须回收,引用计数不为0,不能回收,若是引用计数为0,可是没有回收,会形成内存泄露。若是引用计数为0,继续释放,会形成野指针。为了不出现野指针,咱们在释放的时候,会先让指针=nil。继承

2.ARC(自动引用计数),自动管理内存。

ARC是IOS5推出的新功能,经过ARC,能够自动的管理内存。在ARC模式下,只要没有强指针(强引用)指向对象,对象就会被释放。在ARC模式下,不容许使用retain、release、retainCount等方法。而且,若是使用dealloc方法时,不容许调用[super dealloc]方法。

ARC模式下的property变量修饰词为strong、weak,至关于MRC模式下的retain、assign。strong :代替retain,缺省关键词,表明强引用。weak:代替assign,声明了一个能够自动设置nil的弱引用,可是比assign多一个功能,指针指向的地址被释放以后,指针自己也会自动被释放。

3、与内存有关的修饰符

strong :强引用,ARC中使用,与MRC中retain相似,使用以后,计数器+1。

weak :弱引用 ,ARC中使用,若是只想的对象被释放了,其指向nil,能够有效的避免野指针,其引用计数为1。

readwrite : 可读可写特性,须要生成getter方法和setter方法时使用。

readonly : 只读特性,只会生成getter方法 不会生成setter方法,不但愿属性在类外改变。

assign :赋值特性,不涉及引用计数,弱引用,setter方法将传入参数赋值给实例变量,仅设置变量时使用。

retain :表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1。

copy :表示拷贝特性,setter方法将传入对象复制一份,须要彻底一份新的变量时。

nonatomic :非原子操做,不加同步,多线程访问可提升性能,可是线程不安全的。决定编译器生成的setter getter是不是原子操做。

atomic :原子操做,同步的,表示多线程安全,与nonatomic相反。

4、MRC与ARC混编

MRC与ARC理论上是不能兼容的,也就是你若是建立的项目是ARC模式的,在你的代码中是不能使用release,不然会出现内存问题。如今大部分程序都会选择ARC的方式,可是不少第三方的框架是MRC模式,若是想把这些第三方的文件加到本身项目中,须要进行标识,不然编译的时候会出现错误。

在ARC的项目中,对MRC的文件能够添加编译选项-fno-objc-arc的标识;在MRC的项目中,对ARC的文件能够添加编译选项 -fobjc-arc的标识。 步骤以下图所示。

IOS 内存管理

把MRC文件转为ARC,其实是去掉文件中的retain、release,所以也经过下图中方式完成。

IOS 内存管理

相关文章
相关标签/搜索