AVAudioSession-Category各种姿势
前言
2018新年第一篇, 梳理AVAudioSession
的Category
,解决音频开发中的各种播放被打断或者首次启动时无声音的问题
2018新年第一篇, 梳理AVAudioSession
的Category
,解决音频开发中的各种播放被打断或者首次启动时无声音的问题
前言
目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App
而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们提出了一套解决方案并开发了相应的转场库,目前该转场库已经成为美团点评多个
App 的基础组件之一。
在美团 App
开发的早期,涉及到导航栏样式改变的需求时,经常会遇到转场效果不佳或者与预期样式不符的“小问题”。在业务体量较小的情况下,为了满足快速的业务迭代,通常会使用硬编码的方式来解决这一类“小问题”。但随着美团
App 业务的高速发展,这种硬编码的方式遇到了以下的挑战:
业务模块的不断增加,导致使用硬编码方式编写的代码维护成本增加,代码质量迅速下降。
大型 App 的路由系统使得页面间的跳转变得更加自由和灵活,也使得导航栏相关的问题激增,不但增加了问题的排查难度,还降低了整体的开发效率。
App 中的导航栏属于各个业务方的公用资源,由于缺乏相应的约束机制和最佳实践,导致业务方之间的代码耦合程度不断增加。
从各个角度来看,硬编码的方式已经不能很好的解决此类问题,美团 App 需要一个更加合理、更加持久、更加简单易行的解决方案来处理导航栏转场问题。
本文将从导航栏的概念入手,通过讲解转场过程中的状态管理、转换时机和样式变化等内容,引出了在大型应用中导航栏转场的三种常见解决方案,并对美团的解决方案进行剖析,同时介绍了我们总结的最佳实践。
阅读全文仅以此文解答自己大学以来多年对内存管理的疑惑。
随着计算机的发展,我们的计算机处理的任务也变得越来越繁多,但是对于某台固定的计算机,CPU 和 Memory
都是固定的,如果有些直接使用物理内存地址的话会带来很多问题。首先编译器不能以一种抽象的角度来描绘内存,在执行的过程中如果某个进程占据的内存过大,这个进程可能就无法运行,即便运行了,内存相对来说是非常不安全的,一个不小心操作到了别的进程的内存,可能导致进程的崩溃,如果写入了内核使用的内存可能导致操作系统的崩溃。
现代操作系统的内存管理是非常多计算机科学家智慧的结晶,这种管理方式就是 虚拟内存 (Virtual Memory/VM) 。VM
是一系列技术的总称,包括硬件异常,物理地址,主存,磁盘文件,操作系统内核软件的内存管理。
虚拟内存提供了三大重要的特性:
它将主存看做在存储在磁盘上的地址空间的高速缓存,利用程序的局部性原理,只将活跃的内存加载到主存中,提高了主存的利用率;
为每个进程提供了一个抽象的统一的连续的私有的地址空间。简化了内存管理方式;
对内存进行分段(segment)提供权限能力,保护每个进程的地址空间不会被其他进程影响;
AVAudioRecorder
是一个功能强大且代码简单易用的iOS
、Mac
平台下的音频录制类。它即可从内置的麦克风录制音频,也可从外部音频设备进行录制,比如外接麦克风等。
目前公司主要做Voip
方面的应用,作为iOS
开发者,当然需要对AVFoundation
有个全面的了解。接下来将开启一个系列,记录学习AVFoundation
的过程。
在学习安卓的过程中,发现java
的泛型机制特别的好用,Objective-C
是一门动态性弱类型语言,例如毫无关系的两个类A
和B
,A *a = [[B alloc] init]
在Objective-C
编译和运行中都不会出错。但是A a = new B()
在java
中编译失败。这样,可以强制编程人员注意类型转换。
在不了解Objective-C
的泛型之前,我一直以为Objective-C
的泛型是鸡肋,例如:
|
我声明一个NSString
类型的泛型数组,但是我往数组中添加的是一个NSObject
类型的对象,虽然编译器会警告,但并不会报错(大部分程序猿也会忽略这个警告)。所以,我认为Objective-C
的泛型是鸡肋。当然,这只是我之前的自以为(还是自己学的不深入)。但是今天看过一篇介绍Objective-C
的泛型以后,才发现Objective-C
也能做到编译时报错。
网上关于KVC和KVO的介绍一大片,基本用法这里就不介绍了,这篇主要聊聊KVC和KVO的实现,以及我们自己动手实现一套KVO。
阅读全文我们都知道,每个类都有两个初始化方法,其中一个就是load
方法,对于每一个Class
和Category
来说,必定会调用此方法,而且仅调用一次。当包含Class
和Category
的程序被库载入系统时,就会执行此方法,并且此过程通常是在程序启动的时候执行。
不同的是,现在iOS
系统中已经加入了动态加载特性,这是从macOS
应用程序中迁移而来的特性,等应用程序启动好之后再去加载程序库。如果Class
和其Category
中都重写了load
方法,则先调用Class
中的。那么为什么会先调用Class
的load
方法呢?通过这篇文章想必你会有个答案。
iOS开发中,多线程开发是个头疼的问题,最大的问题就是资源竞争问题。同一时间,多个线程对资源的读或者写都有可能造成不可预知的问题。解决这种问题的手段就是在操作资源的时候加上锁,那么常用的锁都有哪几种呢?本篇博客就来简单的说一说。
阅读全文iOS开发者
会一点RN和android, 十足的海贼迷
河南信悦通网络科技有限公司