谈谈ios内存管理--持续更新

  本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流。做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关。

  一、内存管理是做什么的?

  二、内存管理方式一:MRC

   (一)引用计数器

   (二)原则

   (三)alloc、new、copy、mutableCopy、retain、release、dealloc

      alloc内部实现

      引用计数表

   (四)autorelease

  三、内存管理方式二:ARC

  (一)__strong

  (二)__weak 和__unsafe_unretained

  (三)__autoreleaseing

  (四)

一、内存管理是做什么的?

  内存管理,就是对内存进行管理。先看一个情况:我们用代码创建了一个对象A,对应会分配一块内存空间给它,使用完了对象A,就和系统说一声,系统接到通知,收回内存空间。理当如此。但是,当使用对象A的人不止一个,张三先用完了,李四还在用,张三此时通知系统,“我不用对象A了”,系统接到通知,收回内存空间,还在使用对象A的李四就不能用了(野指针),求李四心里阴影面积。。。为了解决这个问题,苹果官方引入“引用计数器”,引用计数器用来记录当前有多少“人”在使用某个对象,那么收回内存空间的判断标准就变成了——引用计数器的值是0。有一个人开始用对象,该对象的引用计数器就+1,不用了,就-1。这就解决了上述多人使用同一个对象时的内存管理问题。

  那么,内存管理的问题,就集中到了引用计数器的管理上来。

二、内存管理方式一:MRC    

 (一)手动内存管理的思考方式

    大家都知道,MRC是手动管理引用计数模式。在MRC下,OC的内存管理思方式:

    1、自己生成的对象,自己持有;

    2、非自己生成的对象,自己也能持有;

    3、自己不再使用的对象,释放;

    4、非自己持有的对象无法释放。(野指针,比如只有一个pool,但连续用了两次autorelease方法)

    解释一下:持有的意思是retain,让计数器+1,释放的意思是release,让计数器-1。

 (二)alloc、new、copy、mutableCopy、dealloc

    使用alloc、new、copy、mutableCopy得到的对象,不用的时候,要release。调用release方法的时候,内部会判断,如果计数器release之后,计数器为0时,调用对象的dealloc方法,废除(回收、释放)内存空间。

 (三)autorelease

  简单说,在autoreleasepool中调用对象A的autorelease方法,就是使用对象A,但不retain,引用计数器不+1,将对象A添加到自动释放池的一个数组array中,相当于注册登记了一下。等自动释放池drain的时候,会调用自动释放池的dealloc方法,delloc方法调用另一个方法,遍历取出数组array中的对象,并执行对象的release方法。

三、内存管理方式二:ARC

  后来,苹果官方引入了ARC模式,大家解放了很多,因为不用再写retain、release等代码来管理内存了。只要用对应的修饰符来修饰指向对象内存空间的指针,系统就会自动为我们管理内存。

 (一)__strong

 (二)__weak 和__unsafe_unretained

 (三)__autoreleaseing

  (四)

时间: 2024-08-10 13:30:15

谈谈ios内存管理--持续更新的相关文章

如何面试一个1-3年的 iOS 程序员(持续更新)

如何面试一个1-3年的 iOS 程序员(持续更新) 计算机基础类 请说一说 HTTP 1.0 和 1.1之间的区别(懵逼题)这是一道计算机类别的题, 具体区别可以单独写一篇博客了, 但是一般情况下, 最主要的区别还是指1.1中支持长连接. 1.0规定的是浏览器只能与服务器保持短连接, 浏览器的每次请求都需要跟服务器建立一次 TCP 连接, 请求处理完以后就立即断开 TCP 连接, 服务器不跟踪每个客户也不记录过去的请求. 具体可以看这篇博客 请说一说长连接和短连接的区别这个和面试官讨论了一下,

iOS内存管理机制解析之MRC手动引用计数机制

前言: iOS的内存管理机制ARC和MRC是程序员参加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5以前 :MRC(手动引用计数) iOS 5及以后:ARC (自动引入计数) MRC机制时代 "谁开辟申请,谁及时合理释放" 面对自己申请的内存空间是要及时进行回收的: 不及时释放会造成什么结果? 对象存储在栈上,可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露) 不合理释放

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

iOS内存管理(一)

最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的区域,存放函数的参数值,局部变量等.栈是内存中一块连续的区域,它的大小是确定的. 堆区:需要我们来动态的分配,释放,也就是我们内存管理的主角. 我们通过一个简单的例子来看看. NSString *string = [NSString alloc] init]; 我们声明了一个NSString类型的变

IOS 内存管理

一.前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦. OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存.这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小. 二.基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针. ClassA  *

iOS内存管理个人总结

一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称呼: 1>全局变量 2>局部变量 3.三种存储区分别存储那种变量 1>静态存储区 - 在编译分配空间的时候初始化,程序运行时存在 全局变量.静态局部变量 2>stack 栈存放局部变量(这个变量是引用变量或编辑器负责自动释放的变量,例如:int,long,double基础类型,她们并没

iOS内存管理 ARC与MRC

想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC).OC的内存管理机制叫做引用计数,就是一块内存地址可以同时被多个对象引用,每引用一次,引用计数都会递增1,当对象每解除一次引用,引用计数就会递减1,直到引用计数为0时,系统才会讲这块内存地址回收释放掉,这与C/C++语言有些不同,但是它们都遵守同一个内存管理法则:谁申请,谁释放. 在早些时候,iO

【Bugly干货分享】iOS内存管理:从MRC到ARC实践

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与C语言完全不同的.搞明白这些,代码才有可能不 crash.然而就是这么牛逼的内存管理,着实让我这个从 C 转过来的老程序员头疼了一段时间. [C++ 程序员的迷惑和愤怒] iOS 内存管理的核心是引用计数.与众多五年甚至更多以上开发经验的程序员一样,笔者当初是

IOS内存管理retain,assign,copy,strong,weak

IOS内存管理retain,assign,copy,strong,weak IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况)alloc 对象分配后引用计数为1retain 对象的引用计数+1copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为