打通前端与原生的桥梁:JavaScriptCore 能干哪些事情 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情 聊聊前端和原生之间的桥梁 JavaScriptCore,看看它是什么、能做哪些事儿。总结来说,JavaScriptCore 为原生编程语言 Objective-C、Swift 提供调用 JavaScript 程序的动态能力,还能为 JavaScript 提供原生能力来弥补前端所缺能力。正是因为JavaScriptCore的这种桥梁作 2020-07-03
React Native、Flutter 等,这些跨端方案怎么选 React Native、Flutter 等,这些跨端方案怎么选 为了一份代码能够运行在多个平台,从而节省开发和沟通成本,各公司都开始关注和使用跨端方案。目前,主流的跨端方案,主要分为两种:一种是,将 JavaScriptCore 引擎当作虚拟机的方案,代表框架是 React Native;另一种是,使用非 JavaScriptCore 虚拟机的方案,代表框架是 Flutter。使用跨端方案进行开 2020-06-30
libffi:如何编写 Clang 插件 如何编写 Clang 插件 Clang 使用的是模块化设计,可以将自身功能以库的方式来供上层应用来调用。比如,编码规范检查、IDE 中的语法高亮、语法检查等上层应用,都是使用 Clang 库的接口开发出来的。Clang 库对接上层应用有三个接口库,分别是 LibClang、Clang 插件、LibTooling。其中,LibClang 为了兼容更多 Clang 版本,相比Clang少了很多功能; 2020-06-18
libffi:iOS 是怎么管理内存的 iOS 是怎么管理内存的 今天,聊聊 iOS 是怎么管理内存的。不同的系统版本对 App 运行时占用内存的限制不同,你可以利用我在第14篇文章中提到的方法,去查看不同版本系统对App占用内存的具体限制是多少。另外,系统版本的升级也会增加占用的内存,同时App功能的增多也会要求越来越多的内存。然而,移动设备的内存资源是有限的,当App运行时占用的内存大小超过了限制后,就会被强杀掉,从而导致用户体验被 2020-06-12
libffi:动态调用和定义 C 函数 libffi:动态调用和定义 C 函数 在 iOS 开发中,我们可以使用 Runtime 接口动态地调用 Objective-C 方法,但是却无法动态调用 C 的函数。那么,我们怎么才能动态地调用 C 语言函数呢?C 语言编译后,在可执行文件里会有原函数名信息,我们可以通过函数名字符串来找到函数的地址。现在,我们只要能够通过函数名找到函数地址,就能够实现动态地去调用C 语言函数。而在动态链接器中, 2020-06-03
iOS 黑魔法 Runtime Method Swizzling 背后的原理 iOS 黑魔法 Runtime Method Swizzling 背后的原理 提到Object-C中的Runtime,你可能一下就想到了iOS的黑魔法Method Swizzling。毕竟,这个黑魔法可以帮助我们在运行时进行方法交换,或者在原方法执行之前插入自定义方法,以保证在业务面向对象编程方式不被改变的情况下,进行切面功能的开发。但是,运行时进行方法交换同时也会带来一定的风险。所以,今天我就来 2020-05-26
iOS 系统内核 XNU:App 如何加载 iOS 系统内核 XNU:App 如何加载 今天来说说App 如何加载。 iOS 系统架构iOS 系统是基于 ARM 架构的,大致可以分为四层:最上层是用户体验层,主要是提供用户界面。这一层包含了 SpringBoard、Spotlight、Accessibility。第二层是应用框架层,是开发者会用到的。这一层包含了开发框架 Cocoa Touch。第三层是核心框架层,是系统核心功能的框架层。 2020-05-11
编译、汇编、链接、加载、显示 之前写过关于链接的文章dyld 和链接,链接对我们了解组件化和模块化具有重要的意义。 我们写完的文本代码,点击了编译器上 run 按钮之后,是怎么在机器上运行的呢?另外以 iOS APP 为例的可视化应用,又是怎么将 UIView 实例在手机上显示的呢? 前言 计算机的思考方式和人脑的思考方式程序 = 数据结构 + 算法,这个公式是计算机界的定理,不管使用多么高级的语言,cpp 还是 php,不 2020-05-08
如何制定一套适合自己团队的 iOS 编码规范 如何制定一套适合自己团队的 iOS 编码规范 如果团队成员的编码规范各不相同,那么你在接收其他人的代码时是不是总会因为无法认同他的代码风格,而想着去重写呢。但是,重写这个事儿不只会增加梳理逻辑和开发成本,而且重写后出现问题的风险也会相应增加。那么,这个问题应该如何解决呢?在我看来,如果出现这种情况,你的团队急需制定出一套适合自己团队的编码规范。有了统一的编码规范,就能有效避免团队成员由于代码风格不 2020-04-30
如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发 每当你编写完代码后,都会编译看看运行结果是否符合预期。如果这段代码的影响范围小,你很容易就能看出结果是否符合预期,而如果验证的结果是不符合预期,那么你就会检查刚才编写的代码是否有问题。但是,如果这段代码的影响范围比较大,这时需要检查的地方就会非常多,相应地,人工检查的时间成本也会非常大。特别是团队成员多、工程代码量大时,判断这段代码的影响 2020-04-15