一、概述
本篇是 React Native 通信机制详解的第二篇文章,主要介绍 React Native 新架构下的通信机制。如果想要了解旧架构下的通信机制,可以参考上一篇文章。
二、示例
我们仍然从前文末展示的新架构下注册一个原生模块的示例开始。如果你有兴趣自己动手实践下整个过程,可以参考 React Native 的官方文档:
本篇是 React Native 通信机制详解的第二篇文章,主要介绍 React Native 新架构下的通信机制。如果想要了解旧架构下的通信机制,可以参考上一篇文章。
我们仍然从前文末展示的新架构下注册一个原生模块的示例开始。如果你有兴趣自己动手实践下整个过程,可以参考 React Native 的官方文档:
在前文中,我们介绍了 React Native 的新旧两种架构,并在文章末尾介绍了如何在这两种架构中注册和实现一个原生模块。由于篇幅限制,我们并未对其底层原理进行深入介绍。接下来,我们将聚焦于此,深入探讨 React Native 新旧架构下原生模块和 JavaScript 调用的底层实现。
本篇是 React Native 通信机制详解系列的第一篇文章,主要介绍 React Native 旧架构下的通信机制。如果想要了解 React Native 新架构下的通信机制,请点击这里。
React Native 是一个用于构建跨平台移动应用的开源框架,它允许开发者使用 JavaScript 和 React 语法来编写应用,然后将其编译为原生平台的代码,如 iOS 和 Android。随着移动应用复杂度的不断提升,React Native 的架构设计也在不断演进。在 0.68 版本中,React Native 团队引入了全新的架构设计,从根本上解决了旧架构中的性能瓶颈,并带来了诸多创新特性。本文将深入探讨 React Native 新架构的设计理念和实现原理,帮助开发者更好地理解和应用这一重要升级。
在了解了 iOS 异常的分类和捕获原理后,我们继续深入探讨 KSCrash 这个优秀的异常监控框架的实现原理。KSCrash 作为一个功能丰富的异常监控方案,其实现涉及多个复杂的技术模块。本文将重点为你解析 KSCrash 的整体架构,并深入剖析其核心监控系统的实现细节。至于其他功能模块的实现,我们会在后续文章中逐一展开。
KSCrash 的整体架构清晰而模块化,主要包含五个核心部分:
在 iOS 中,异常(Exception)是指程序运行过程中出现的非正常情况,这种情况下应用无法再正常继续执行下去了,也就是我们常说的应用崩了。
异常有好几种,按照从底层到上层的顺序来说的话,依次是:
Mach 异常是由操作系统内核引发的,常见的比如访问了无效内存地址、除零错误等,它是一种底层的异常机制。
BSD Signal 异常是 Mach 异常在 BSD 层的一种表现形式,通常是由 Mach 异常转换而来的,常见的比如SIGSEGV(段错误)、SIGBUS(总线错误)、SIGABRT(异常终止)等。
在 iOS 应用的 crash 治理过程中,有相当一大部分问题最终的堆栈是在系统库之中的,因此为了解决这些问题,就需要通过逆向手段来分析系统库的内在逻辑,找到 crash 发生的原因。本文介绍如何利用 dyld_shared_cache 和 Hopper 进行分析。
进行逆向分析的第一步,是获取系统库的二进制文件。如果你有一台 iPhone 设备,并且你要分析的 crash 就发生在这个设备或者这个设备对应的系统版本上,那么获取系统库二进制文件就非常简单,只需将设备连接到 Mac 上,然后在 Xcode 中将它选中作为 Build Target,Xcode 就会从 iPhone 中拷贝出所需的文件。
前文分析过 Aspects 实现 AOP 的原理,而由饿了么开源的组件 Stinger同样是一个用于 AOP 的组件,并且饿了么宣称 Stinger 在性能上能够吊打 Aspects,并且给出了测试的数据。那么 Stinger 究竟是如何实现性能的飞跃的呢?让我们一起来探究一下。
EasyTuple是由美团开源的一个第三方库,它给Objective-C 添加了元组的能力,可以将几个对象包裹在一个对象中,这样我们就可以从一个函数中返回多个值。它的使用非常简单,比如我们想创建一个由两个元素组成的元组,那么可以这样写:
EZTuple2<NSNumber *, NSString *> *tuple = EZTuple(@1, @"string");
在 iOS 开发中,布局是一个永恒的话题。Masonry 作为一个广受欢迎的自动布局框架,以其简洁的链式语法优雅地解决了这个问题。今天,让我们揭开它的神秘面纱,一起探索其内部实现原理。
在深入源码之前,我们先看看 Masonry 是如何简化我们的日常开发工作的。下面是一个典型的使用示例:
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top);
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
今天我们将对另外一个在 iOS 开发中广泛使用的库的源代码进行分析,这个库就是鼎鼎大名的 SDWebImage。
SDWebImage 的使用非常简洁,往往可以用一行代码来完成图片设置工作。下面列出一些常用设置方法。
- (void) sd_setImageWithURL:(nullable NSURL *) url;
- (void) sd_setImageWithURL:(nullable NSURL *) url placeholderImage:(nullable UIImage *) placeholder;
- (void) sd_setImageWithURL:(nullable NSURL *) url placeholderImage:(nullable UIImage *) placeholder options:(SDWebImageOptions) options;
- (void)sd_setImageWithURL:(nullable NSURL *) url completed:(nullable SDExternalCompletionBlock) completedBlock;
- (void) sd_setImageWithURL:(nullable NSURL *) url placeholderImage:(nullable UIImage *) placeholder options:(SDWebImageOptions) options completed:(nullable SDExternalCompletionBlock) completedBlock;