前言

目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App
而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们提出了一套解决方案并开发了相应的转场库,目前该转场库已经成为美团点评多个
App 的基础组件之一。

在美团 App
开发的早期,涉及到导航栏样式改变的需求时,经常会遇到转场效果不佳或者与预期样式不符的“小问题”。在业务体量较小的情况下,为了满足快速的业务迭代,通常会使用硬编码的方式来解决这一类“小问题”。但随着美团
App 业务的高速发展,这种硬编码的方式遇到了以下的挑战:

  1. 业务模块的不断增加,导致使用硬编码方式编写的代码维护成本增加,代码质量迅速下降。

  2. 大型 App 的路由系统使得页面间的跳转变得更加自由和灵活,也使得导航栏相关的问题激增,不但增加了问题的排查难度,还降低了整体的开发效率。

  3. App 中的导航栏属于各个业务方的公用资源,由于缺乏相应的约束机制和最佳实践,导致业务方之间的代码耦合程度不断增加。

从各个角度来看,硬编码的方式已经不能很好的解决此类问题,美团 App 需要一个更加合理、更加持久、更加简单易行的解决方案来处理导航栏转场问题。

本文将从导航栏的概念入手,通过讲解转场过程中的状态管理、转换时机和样式变化等内容,引出了在大型应用中导航栏转场的三种常见解决方案,并对美团的解决方案进行剖析,同时介绍了我们总结的最佳实践。

阅读全文

前言

仅以此文解答自己大学以来多年对内存管理的疑惑。

经典操作系统的虚拟内存

为什么要有虚拟内存?

随着计算机的发展,我们的计算机处理的任务也变得越来越繁多,但是对于某台固定的计算机,CPU 和 Memory
都是固定的,如果有些直接使用物理内存地址的话会带来很多问题。首先编译器不能以一种抽象的角度来描绘内存,在执行的过程中如果某个进程占据的内存过大,这个进程可能就无法运行,即便运行了,内存相对来说是非常不安全的,一个不小心操作到了别的进程的内存,可能导致进程的崩溃,如果写入了内核使用的内存可能导致操作系统的崩溃。

现代操作系统的内存管理是非常多计算机科学家智慧的结晶,这种管理方式就是 虚拟内存 (Virtual Memory/VM) 。VM
是一系列技术的总称,包括硬件异常,物理地址,主存,磁盘文件,操作系统内核软件的内存管理。

虚拟内存提供了三大重要的特性:

  1. 它将主存看做在存储在磁盘上的地址空间的高速缓存,利用程序的局部性原理,只将活跃的内存加载到主存中,提高了主存的利用率;

  2. 为每个进程提供了一个抽象的统一的连续的私有的地址空间。简化了内存管理方式;

  3. 对内存进行分段(segment)提供权限能力,保护每个进程的地址空间不会被其他进程影响;

阅读全文

AVAudioRecorder是一个功能强大且代码简单易用的iOSMac平台下的音频录制类。它即可从内置的麦克风录制音频,也可从外部音频设备进行录制,比如外接麦克风等。

阅读全文

iOS强大的泛型

发布在 Objective-C

在学习安卓的过程中,发现java的泛型机制特别的好用,Objective-C是一门动态性弱类型语言,例如毫无关系的两个类ABA *a = [[B alloc] init]Objective-C编译和运行中都不会出错。但是A a = new B()java中编译失败。这样,可以强制编程人员注意类型转换。

在不了解Objective-C的泛型之前,我一直以为Objective-C的泛型是鸡肋,例如:

@property (nonatomic, strong) NSMutableArray<NSString *> *times;
[self.times addObject:[[NSObject alloc] init]];

我声明一个NSString类型的泛型数组,但是我往数组中添加的是一个NSObject类型的对象,虽然编译器会警告,但并不会报错(大部分程序猿也会忽略这个警告)。所以,我认为Objective-C的泛型是鸡肋。当然,这只是我之前的自以为(还是自己学的不深入)。但是今天看过一篇介绍Objective-C的泛型以后,才发现Objective-C也能做到编译时报错。

阅读全文

深入理解Block

发布在 Objective-C

iOS开发中,经常会使用到Block,那Block到底是什么?它的实现方式是什么?通过阅读《Objective-C高级编程:iOS与OS X多线程和内存管理》,会对Block有个更深的了解。

阅读全文

load 方法全程跟踪

发布在 Objective-C

load方法的调用时机

我们都知道,每个类都有两个初始化方法,其中一个就是load方法,对于每一个ClassCategory来说,必定会调用此方法,而且仅调用一次。当包含ClassCategory的程序被库载入系统时,就会执行此方法,并且此过程通常是在程序启动的时候执行。

不同的是,现在iOS系统中已经加入了动态加载特性,这是从macOS应用程序中迁移而来的特性,等应用程序启动好之后再去加载程序库。如果Class和其Category中都重写了load方法,则先调用Class中的。那么为什么会先调用Classload方法呢?通过这篇文章想必你会有个答案。

阅读全文

iOS开发中,多线程开发是个头疼的问题,最大的问题就是资源竞争问题。同一时间,多个线程对资源的读或者写都有可能造成不可预知的问题。解决这种问题的手段就是在操作资源的时候加上锁,那么常用的锁都有哪几种呢?本篇博客就来简单的说一说。

阅读全文
Copyrights © 2019 贵永冬. All Rights Reserved.
作者的图片

贵永冬

iOS开发者
会一点RN和android, 十足的海贼迷


河南信悦通网络科技有限公司


河南 郑州