美文网首页
iOSARC 下的内存管理问题

iOSARC 下的内存管理问题

作者: 恋空K | 来源:发表于2019-07-18 15:13 被阅读0次

有些同学想测试当对象释放时,其 retainCount 是否变成了 0,他们的试验代码如下:

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

NSObject*object = [[NSObjectalloc] init];

NSLog(@"Reference Count = %u", [object retainCount]);

    [object release];

NSLog(@"Reference Count = %u", [object retainCount]);

returnYES;

}

不要向已经释放的对象发送消息:

但是,如果你真的这么实验,你得到的输出结果可能是以下这样:

Reference Count = 1

Reference Count = 1

我们注意到,最后一次输出,引用计数并没有变成 0。这是为什么呢?因为该对象的内存已经被回收,而我们向一个已经被回收的对象发了一个 retainCount 消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩溃。

那为什么在这个对象被回收之后,这个不确定的值是 1 而不是 0 呢?这是因为当最后一次执行 release 时,系统知道马上就要回收内存了,就没有必要再将 retainCount 减 1 了,因为不管减不减 1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域,包括 retainCount 值也变得没有意义。不将这个值从 1 变成 0,可以减少一次内存的写操作,加速对象的回收。

拿Linux 文件系统举列,Linux 文件系统下删除一个文件,也不是真正的将文件的磁盘区域进行抹除操作,而只是删除该文件的索引节点号。这也和引用计数的内存回收方式类似,即回收时只做标记,并不抹除相关的数据。

ARC 下的内存管理问题

ARC 能够解决 iOS 开发中 90% 的内存管理问题,但是另外还有 10% 内存管理,是需要开发者自己处理的,这主要就是与底层 Core Foundation 对象交互的那部分,底层的 Core Foundation 对象由于不在 ARC 的管理下,所以需要自己维护这些对象的引用计数。

对于 ARC 盲目依赖的 iOS 新人们,由于不知道引用计数,他们的问题主要体现在:

过度使用 block 之后,无法解决循环引用问题。

遇到底层 Core Foundation 对象,需要自己手工管理它们的引用计数时,显得一筹莫展。

弱引用的实现原理

弱引用的实现原理是这样,系统对于每一个有弱引用的对象,都维护一个表来记录它所有的弱引用的指针地址。这样,当一个对象的引用计数为 0 时,系统就通过这张表,找到所有的弱引用指针,继而把它们都置成 nil。

在调试内存问题时,Instruments 工具可以很好地对我们进行辅助,善用 Instruments 可以节省我们大量的调试时间。

相关文章

  • iOSARC 下的内存管理问题

    有些同学想测试当对象释放时,其retainCount是否变成了 0,他们的试验代码如下: - (BOOL)appl...

  • Objective-C:内存管理

    内存管理的问题#   先看看下面的几段代码,重温一下使用内存常见的问题。   C语言中内存操作常见错误: 内存分配...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • 伙伴算法和slab算法

    0. 内存管理问题 内存碎片太小和管理内存碎片的效率问题 内存碎片:回收内存时,将内存块放入free链表中。因内存...

  • 内存问题分析(二)-内存管理基础(下)

    接上篇继续总结内存管理基础。 五、内存回收 无论计算机上有多少内存都是不够的,因而linux kernel需要通过...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • iOS/OS X 内存管理(二):借助工具解决内存问题

    iOS/OS X 内存管理(二):借助工具解决内存问题 iOS/OS X 内存管理(二):借助工具解决内存问题

  • iOS内存管理

    几个问题 iOS内存管理的机制是什么 iOS内存管理什么情况会对象让引用计数会增加 什么情况下会内存暴增,怎么解决...

  • 前端内存监控 —— 使用Performance工具

    目录 内存管理为什么要监控?? Performance工具使用流程 内存问题产生内存问题的现象及本质界定内存问题的...

  • block循环引用问题

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识。 iOS的内存管理...

网友评论

      本文标题:iOSARC 下的内存管理问题

      本文链接:https://www.haomeiwen.com/subject/zedllctx.html