iOS学习之内存管理

1.1 引用计数 Reference Count

1.2 自动引用计数,ARC(Automatic Reference Counting

  1. 1引用计数

引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。

内存管理五种思考方式:

  • 自己生成的对象,自己持有(自生自持)
  • 非自己生成的对象,自己也能持有(非自生自持)
  • 不需要自己持有的对象释放
  • 非自己持有的对象无法释放
  • 不要向已经释放的对象发送消

1. 自生自持

用以下方法生成对象自己持有(计数加一):

  • alloc、new、copy、mutableCopy
  • allocMyobject、newThatObject、copyThis、mutableCopyYourObject

id obj=[NSObject alloc]init];(计数加1

2. 非自生自持

使用retain使非自生可自持

Id obj=[NSMutableArray array];(计数不加1)

[obj retain];(计数加1

 

3. 不需要自己持有的对象释放

使用alloc、new、copy、mutableCopy或者retain方法持有的对象,一旦不需要,使用release方法释放

[obj release];

 

4. 非自己持有的对象无法释放

Id obj=[obj0 object];

[obj1 release]; (obj1没有自己持有,释放的话会造成程序异常崩溃)

5. 不要向已经释放的对象发送消

我们向一个已经被回收的对象发了一个 retainCount 消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩溃

 

自动释放池原理:

调用release会立刻将保留计数减1,还可能回收对象,使用authorelease,计数会在稍后减1,通常是在下一次“事件循环”。在方法返回对象时很有用。

 

 

 

 

 

2.ARC

  1. 由于ARC是自动执行retain,release,autorelease,dealloc是不能调用的。
  2. ARC必须遵守的方法命名规则:

以alloc,new,copy,mutableCopy,开头的。其返回的对象规调用者所有。(自生自持)。

  1. ARC 管理对象生命的办法基本上就是:在合适的地方插入“retain”,“release”操作。
  2. CoreFoundation对象不归ARC管理

 

ARC 帮我们解决了引用计数的90%问题,但是还有 10% 内存管理,是需要自己处理的

需要自己维护这些对象的引用计数。

对于问题主要体现在:

  1. 过度使用 block 之后,无法解决循环引用问题。
  2. 遇到底层 Core Foundation 对象,需要自己手工管理它们的引用计数时,显得一筹莫展。

1. 循环引用(Reference Cycle)问

1) 相互引用了对方作为自己的成员变量

解决方法:

  1. 主动断开循环引

明确知道这里会存在循环引用,在合理的位置主动断开环中的一个引用。

主动断开循环引用这种操作依赖于程序员自己手工显式地控制,相当于回到了以前 “谁申请谁释放” 的内存管理年代,所以这种解决方法并不常用

 

  1. 使用弱引

弱引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用的产生

两个 ViewController A 和 B,ViewController A 需要弹出 ViewController B,让用户输入一些内容,当用户输入完成后,ViewController B 需要将内容返回给 ViewController A。这个时候,View Controller 的 delegate 成员变量通常是一个弱引用,以避免两个 ViewController 相互引用对方造成循环引用问题。

使用Xcode 的Instruments检测循环引用

:Product -> Profile,然后选择 “Leaks”,

2. Core Foundation 对象的内存管

对于 Core Foundation 对象,由于不在 ARC 管理之下,我们仍然需要延续以前手工管理引用计数的办法

  • CFRetain 和 CFRelease 两个方法,读者可以直观地认为,这与 Objective-C 对象的 retain 和 release 方法等价。

所以对于底层 Core Foundation 对象,我们只需要延续以前手工管理引用计数的办法即可。

这就引入了bridge相关的关键字,以下是这些关键字的说明:

  • __bridge: 只做类型转换,不修改相关对象的引用计数,原来的 Core Foundation 对象在不用时,需要调用 CFRelease 方法。
  • __bridge_retained:类型转换后,将相关对象的引用计数+ 1,原来的 Core Foundation 对象在不用时,需要调用 CFRelease 方法。
  • __bridge_transfer:类型转换后,将该对象的引用计数交给 ARC 管理,Core Foundation 对象在不用时,不再需要调用 CFRelease 方法。
时间: 2024-10-12 14:33:57

iOS学习之内存管理的相关文章

2015 IOS 学习笔记 内存管理,页面跳转 ——蓝懿教育

——————————内存管理———————————————— 手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSM

iOS夯实:内存管理

iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 Objective-C 提供了两种内存管理方式. MRR (manual retain-release) 手动内存管理这是基于reference counting实现的,由NSObject与runtime environment共同工作实现. ARC (Automatic Reference Cou

[转载]对iOS开发中内存管理的一点总结与理解

对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作的理解是衡量一个程序员成熟与否的一个标准.好了,闲话不说,下面进入正题. 众所周知,ObjectiveC的内存管理引用的一种叫做“引用计数“ (Reference Count)的操作方式,简单的理解就是系统为每一个创建出来的对象,(这里要注意,只是对象,NSObject的子类,基本类型没有‘引用计数’)

JVM学习笔记-内存管理

第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描述的是java方法执行的内存模型:栈帧,用户存储 局部变量表,操作数栈,动态链接,方法出口等信息. 局部变量表在编译时即可完全确定!如果线程请求的栈深度大于 规定的深度,StackOverflowError. 2) 本地方法栈,类似. 3)堆:垃圾收集器管理的主要区域.线程共享. 4)方法区: 各个线程共享.存储:加载的类信息,常量,静态变量,即时

ios 进阶 -- 图片内存管理

最近在做优化程序的性能方面的工作,涉及到了图片内存管理方面,所以这方面的内容总结一下, 1,为什么做图片内存管理? 问题a,程序启动后,浏览图片时, 内存一直增长. 问题b,  浏览图片时,程序UI显示不流畅,即使本地的图处,也不流畅. 2,怎么做图片内存管理? 对应用程序域内的图片内存进行管理, 当程序的多个地方需要 引用一个图片时,都指向同一个图片的内存地址. 3,如何做? 如果是本地资源时的图片,地址固定,不存在过期问题 我们可以直接 使用系统  [UIImage  ImageName:]

【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容

我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对象的过程:先分配内存空间存储对象:初始化成员变量:返回对象的指针. (2)对象在创建时,内部会自己主动创建一个引用计数器retainCount,当retainCount=0时,系统会回收当前对象,retainCount是唯一推断标记.release会-1.retain会+1,retain后返回的是自

【iOS开发-33】学习手动内存管理暂时抛弃ARC以及retain/assign知识——iOS工程师面试必考内容

我们为什么需要内存管理?当使用内存达到40M和45M时候会发出警告,如果不处理,占用内存达到120M时直接强制关闭程序.所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对象的过程:先分配内存空间存储对象:初始化成员变量:返回对象的指针. (2)对象在创建时,内部会自动创建一个引用计数器retainCount,当retainCount=0时,系统会回收当前对象,retainCount是唯一判断标记.release会-1,retain会+1,retain后返回的是自己se

iOS开发ARC内存管理技术要点

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging 技术交流新QQ群:41

Objective-C高级编程:iOS多线程及内存管理(第一章翻译)

写在翻译之前:当初看到这本书的时候,感觉深入浅出讲得比较到位,但是在市面上看到的翻译版本翻译的却没有原著的精髓和味道.所以产生了自己将其翻译一下给初学者一些便利的想法.所以才有了这个系列的第一章的翻译.目前剩余的部分依然在翻译过程中,估计不久之后就可以陆续地发出了. 因为本人的水平或者用词问题,本翻译难免有不周详或不正确之处.如果有人看到还望指出,我一定会尽力地修改那些不正确的部分,让更多的人可以看到更优质的资料. Chapter 1 Life before Automatic Referenc