ios内存管理

那怎么知道对象已经没有被引用了呢?

ObjC采用引用计数(reference counting)的技术来进行管理:

1)每个对象都有一个关联的整数,称为引用计数器

2)当代码需要使用该对象时,则将对象的引用计数加1

3)当代码结束使用该对象时,则将对象的引用计数减1

4)当引用计数的值变为0时,表示对象没有被任何代码使用,此时对象将被释放。

与之对应的消息发送方法如下:

1)当对象被创建(通过alloc、new或copy等方法)时,其引用计数初始值为1

2)給对象发送retain消息,其引用计数加1

3)給对象发送release消息,其引用计数减1

4)当对象引用计数归0时,ObjC給对象发送dealloc消息销毁对象


使用自动释放池需要注意:

      1)自动释放池实质上只是在释放的时候給池中所有对象对象发送release消息,不保证对象一定会销毁,如果自动释放池向对象发送release消息后对象的引用计数仍大于1,对象就无法销毁。

2)自动释放池中的对象会集中同一时间释放,如果操作需要生成的对象较多占用内存空间大,可以使用多个释放池来进行优化。比如在一个循环中需要创建大量的临时变量,可以创建内部的池子来降低内存占用峰值。

3)autorelease不会改变对象的引用计数

自动释放极端情况:

自动释放池的释放时间是确定的,这个例子中自动释放池会在循环事件结束时释放,那问题来了:在这个十万次的循环中,每次都会生成一个字符串并打印,这些字符串对象都放在池子中并直到循环结束才会释放,因此在循环期间内存不增长。

这类问题的解决方案是在循环中创建新的自动释放池,多少个循环释放一次由我们自行决定。

iOS5以后开始使用ARC来管理内存:

1、ARC可以理解成一位管家,这个管家会帮我们向对象发送retain和release语句

2、ARC能帮我们简化内存管理问题,但不代表它是万能的,还是有它不能处理的情况,这就需要我们自己手动处理,比如循环引用、非ObjC对象、Core Foundation中的malloc()或者free()等等

3、__strong:强引用,持有所指向对象的所有权,无修饰符情况下的默认值。如需强制释放,可置nil

4、__weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置nil,避免野指针

可以用僵尸断点来探测野指针

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Objective-C,顾名思义,是一门超C的语言,自从ARC(Auto Reference Count)出现了之...
    xiao彰阅读 3,301评论 0 2
  • Copyright © 2017年ZaneWangWang. All rights reserved. 如果你看到...
    2897275c8a00阅读 4,442评论 0 1
  • 冯·诺依曼体系:运算器 控制器 存储器 输入与输出 内存即存储器,用来存储指令与数据 注:哈佛体系与普林斯顿体系的...
    小李龍彪阅读 3,856评论 0 8
  • # 前言 反复地复习iOS基础知识和原理,打磨知识体系是非常重要的,本篇就是重新温习iOS的内存管理。 内存管理是...
    Vein_阅读 4,258评论 0 2
  • 概要 Objective-c中的内存管理,也就是引用计数。提供了两种内存管理机制MRC(Mannul Refere...
    小韓阅读 2,795评论 0 0

友情链接更多精彩内容