揭秘dispatch_once的内部实现
这是一篇译文,原文Secrets of dispatch的作者是Mike Ash大神。在拜读这篇文章之后,颇有收获,不得不感叹Mike Ash专业知识的深度与广度。因此,我想试着进行翻译以加深理解。
这是一篇译文,原文Secrets of dispatch的作者是Mike Ash大神。在拜读这篇文章之后,颇有收获,不得不感叹Mike Ash专业知识的深度与广度。因此,我想试着进行翻译以加深理解。
世界是多元的,相比之下个人的生活圈显得单一,特别是像我这样在二线省会城市的普通青年。最近有两件事情让我感触挺深的,它们彼此之间没有交集,与我的生活也相差甚远。它们代表着世界在同一时段下的不同呈现方式,陌生却又是那么真实。
最近在做iOS真机测试时出现了运行失败的提示:“Could not locate device support files”。原因在于我的iPhone6上的iOS版本上11.4,而Xcode的版本是8.3.3,当前的Xcode过低不能将App安装到iOS11.4上。
页面跳转属于iOS开发中很常用的一个功能,然而即便是这个看似简单的功能也可以根据不同需求有三个实现方式。下面一一介绍。
记得还在上一家公司任职的时候,在研发部的探讨会会上就“+load的加载过程”这一议题有过激烈的讨论,大家各执一词,争得面红耳赤。最终是部门老大专门做了一期讲解,才平息了这场争执。但是那时候的讲解并未涉及到源代码分析,而是基于测试代码做的分析,故我并没有完全理解。
在苹果开发文档中提及到:+load是在类或者分类被添加到runtime的时候被调用,而+initialize则是在类的用实例方法或者类方法第一次被调用之前调用。
上面的说明只是说明了这两个函数调用时机,但是并没有涉及父类、子类和分类之间的调用顺序和相互影响,于是试着结合apple公司的开源代码objc4-532.2试着分析这两个函数的加载过程,以加深理解。
Objective-C Category(分类)之于我而言有种神秘感,虽然自己已经在实际开发过程中已经多次使用它,且感受到了它带来的便利与高效。但是我却仅仅是停留在对它的基本使用层面,除此之外一无所知。我能感觉它的强大,心中也一直有种对它内部实现一探究竟的冲动,奈何迟迟没有行动。时间愈久,这种情绪愈发浓烈,今天终究是按耐不住了…
“揭开ARC的神秘面纱系列”的这篇续集全都是关于@autoreleasepool这一新指令的。LLVM提及到autorelease pools(自动释放池)的语义已经在LLVM3.0版本中发生变化,尤其是,我觉得探究ARC模式更新之后是如何实现的会很有意思。
以下是正文:
写完第一篇关于揭开ARC神秘面纱的博客,我想和大家分享另外一些有趣的片段。这一次我好奇当你通过函数返回一个存在数组中的对象时会发生什么。非ARC模式,你可能会对这个对象retain一次再返回一个自动释放的对象。ARC模式下,我们虽然可以免去这些内存管理的操作,但还是不放心,觉得别扭。因此,我决定检测一下ARC是否做到位了。
这个系列一共有四篇博客,是Matt Galloway大神关于ARC的内部实现的一些探索,看完之后觉得收获不少。因此尝试着翻译出来和大家分享,一定会翻译不当之处,希望大家及时指正。
原文地址
以下是正文:
在Twitter上和@jacobrelkin进行了一次交流之后,我决定写几篇博客关于ARC在神秘的面纱之下是如何运转和如何窥视其内部机制的方法。这篇博客我将解释ARC如何处理retain、release和autorelease这三个关键字对应的内部实现。