自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Leo的专栏

Everything is an experiment, you win or learn~

原创 性能深度分析之SystemTrace

前言 App中大多数的性能指标都和时间相关,如启动速度,列表滑动FPS,页面打开耗时等等。为了优化这些指标,我们需要了解时间都消耗在哪里。 通常我们会打开Time Profiler,通过聚合Call Stack来分析和优化代码耗时。偶尔会出现优化后Time Profiler已经没有什么高耗时的Ca...

2020-03-08 19:12:00 746 6

原创 深入理解Symbol

这里是引用 前言 符号(Symbol)是日常开发中经常接触的一个概念,虽然日常开发中直接应用的场景比较少,但符号编译期和运行时都扮演了重要的角色。 符号是什么 维基百科的定义 A symbol in computer programming is a primitive data type w...

2019-11-30 23:02:55 842 0

原创 聊聊应用内购买

前言 上一份工作中,断断续续开发和维护了两年左右的内购,换工作后短期内应该不会做相关业务了,所以趁着“记忆”还是热乎的,写下这篇文章。 希望读者通过阅读本文能够解决一些问题或者找到一些产品灵感,本文主要包括三个方面: 内购的基本概念; 代码层面如何开发,坑和对应的解决方案; 应用审核和后续运营的...

2019-04-21 23:04:31 11380 8

原创 深入浅出iOS编译

前言 两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚: Clang和LLVM究竟是什么 源文件到机器码的细节 Linker做了哪些工作 编译顺序如何确定 头文件是什么?XCode是如何找到头文件的? C...

2018-12-23 20:59:26 14427 8

原创 iOS 性能优化 - TimeProfiler分析代码耗时

Time Profiler Time Profiler用来分析代码的执行时间,主要用来分析CPU使用情况。 注意:要在release模式(或者自定义的其他的打包模式)下分析,原因在release模式下: 会开启编译器优化,提高代码运行效率 生成调试的符号表,这样才能够在profile的时候看到代...

2018-11-20 23:37:02 3346 0

原创 iOS 性能优化 - Allocations分析内存分配

Allocations Allocations用来分析静态内存分配。 Demo项目 Demo App Demo是一个简单的图片应用:首页只有一个简单的入口;次级页面会读取本地页面,加滤镜,然后按照瀑布流的方式显示出来;第三个页面提供大图显示; 运行代码:点击Photos -&gt...

2018-10-21 14:45:24 3824 1

原创 XCode 10打包上传后在iOS 9上Crash(2018)

问题描述: XCode 10打包的App在iOS 9上Crash。 原因: App Store的Bug,上传后的代码经过App Store处理后,加载assets中的图在iOS 9上会Crash。 解决方案: 切回到XCode 9.4打包,前提是你没有用到一些iOS 12的新特性。 弃用Asse...

2018-09-28 23:12:27 4402 4

原创 聊聊AppDelegate解耦

AppDelegate 在iOS开发中,AppDelegate指的是UIApplicationDelegate,用来处理App层面的事件,包括生命周期变化,OpenURL,处理HandOff和Intent等。 每个iOS都有一个入口函数main,其中的一个参数就是AppDelegate: i...

2018-08-12 18:52:46 25454 1

原创 实现一个优雅的iOS事件总线

目标 订阅登录事件LoginEvent,当self dealloc时候自动取消订阅 [QTSub(self, LoginEvent) next:^(LoginEvent *event) { }]; 订阅通知NSNotification,当self dealloc的时候自动取消订阅 ...

2018-07-12 22:33:40 5090 6

原创 深入理解iOS Crash Log

Crash Log Crash Log的主要来源有两种: Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载 三方或者自研Framework统计,三方服务包括Fabric,Bugly等。 这篇文章讲到的Crash Log是Apple提供的。 ...

2018-07-06 21:11:36 25629 4

原创 XCode启动参数和环境变量

前言 这一部分介绍XCode中Argument/Options模块,通过这两个模块,我们可以在启动App的时候传递一些额外的参数进去,覆盖系统的默认值,从而实现特定场景的调试。 Options Options这里的内容相对简单,但是却容易被忽略。 Core Location用来模...

2018-06-30 12:54:57 3166 1

原创 Safari/Chrome调试WebView

前言 最近在写《iOS代码调试》系列的博客,估计会有十篇以上的内容,等到都写完了会在Github开源出来,欢迎关注我的Github: LeoMobileDeveloper WebView 大多数App会选择H5去实现某些弱交互但是却需要热更新界面,这时候WebView就派上用场了,那么...

2018-06-17 21:51:07 8906 0

原创 深入理解Toll-Free Bridging

前言 Toll-Free Bridging本身不是什么新技术,那为什么还要写这篇博客呢? 原因是今天和一个同事讨论到相关问题的时候,发现理解并不够深入,于是仔细研究了下,整理成了这篇博客。 本文的Github地址:LeoMobileDeveloper Toll-Free Bridgin...

2018-04-26 15:28:28 1961 4

原创 iOS汇编精讲(上篇)

前言 日常的应用开发中,主要用的语言是Objective(Swift),一些特殊场景下,可能还会用到C/C++,JavaScript,Shell,Python等。 那么,一个iOS开发者为什么要了解汇编这么底层的语言呢? 因为看得懂汇编能够提高的代码调试和逆向能力。 本文是作者学习...

2018-04-21 12:11:32 3897 7

原创 Sqlite的事务,锁和WAL模式

前言 事务定义了一组SQL语句的边界,这组SQL语句要么都执行,要么都不执行,事务保证了数据库完整性中的原子性。事务与数据库锁是紧密相关的,Sqlite用锁来保证事务的并发和执行顺序。 事务 在讲解事务的原理之前,我们先看看事务相关的API,主要有三个: begin transact...

2018-03-21 22:49:14 2507 0

原创 Objective C范型

范型 范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。 以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码 func swapTwoInts(_ a: inout Int, _ b: inout Int) { ...

2018-01-07 14:51:16 1819 0

原创 新年快乐

新年快乐

2017-12-31 21:33:10 804 3

原创 Fishhook替换C函数的原理

FishhookFishhook是FaceBook出品的,可以用来Hook C函数的一个开源库。它的主要接口就一个:struct rebinding { const char *name; //字符串名称 void *replacement; //替换后的方法 void **repla...

2017-11-04 16:17:48 4684 0

原创 深入理解iOS App的启动过程

前言 启动时间是衡量应用品质的重要指标。 本文首先会从原理上出发,讲解iOS系统是如何启动App的,然后从main函数之前和main函数之后两个角度去分析如何优化启动时间。准备知识Mach-O哪些名词指的是Mach-o Executable 可执行文件 Dylib 动态库 Bundle 无法被...

2017-10-23 13:28:28 17706 23

原创 聊聊SQLite - 基础篇

SQLite SQLite是一个关系型数据库,是一个嵌入式的数据库,它的核心代码由C编写,直接在宿主应用中运行。 本来想一篇长文章涵盖想写的内容,最后发现想写的东西太多了,就拆分成:基础篇,原理篇和iOS应用篇发出来吧。 MAC OS的命令行字带SQLite。以下示例均在命令行中进行,C A...

2017-09-24 15:38:39 1310 0

原创 Moya的设计之道

前言 Moya是一个基于Alamofire开发的,轻量级的Swift网络层。Moya的可扩展性非常强,可以方便的RXSwift,PromiseKit和ObjectMapper结合。 如果你的项目刚刚搭建,并且是纯Swift的,非常推荐以Moya为核心去搭建你的网络层。另外,如果你对Alamof...

2017-08-11 13:44:52 6877 21

原创 实现60fps的网易云音乐首页

前言网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户。最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable。为了去验证框架的可用性,我选择了网易云音乐的首页来作为Demo,语言是Swift 3。本文的内容包括: 实现网易云音乐首页的思路 如何建立...

2017-07-28 14:38:34 4441 5

原创 理解网络分层与数据加密

网络分层网络的基础分层是OSI的七层架构: OSI的全称是Open System Interconnection(开放系统互联模型),是由国际标准化组织ISO设计,解决不同体系结构网络互相连接的问题。 实际应用中,五层架构是最常见的,也是最容易理解的:网络分层后,每一层都工作着不同的协议和实际...

2017-07-22 20:29:34 2524 0

原创 优雅的开发TableView

前言UITableView(UITableViewController)是iOS开发使用频率最高的一个组件。不管是使用UITableView还是还是UITableViewController,在开发的时候,我们都需要实现两个协议: UITableViewControllerDataSource U...

2017-06-19 11:57:34 6168 8

原创 MVVM与Controller瘦身实践

前言MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式。实际上,Cocoa Touch就是按照MVC来设计的。这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理念。在开发App的时候,我们的基本目标有以下几点: 可靠性 - App的功能能够正常使用 健壮性...

2017-06-12 11:20:19 9477 6

原创 Alamofire的设计之道

前言:Alamofire是一个由Swift编写的优雅的网络开发框架。大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在不断的对其进行完善,所以学习这种优秀的开源代码对深入理解Swift的特性很有帮助。

2017-06-03 18:54:52 10535 3

原创 消息转发机制与Aspects源码解析

前言最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码。 这类业务有一个特点,业务内容是对应整个App的,与对应的ViewController毛关系都没有,但是却不得不耦合到(即使是调用代码可以精简到一行)...

2017-05-22 22:55:51 3582 1

原创 Objective C block背后的黑魔法

前言block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用。那么block这套机制在Objective C中是如何实现的呢?本文通过从C/C++到汇编层面分析block的实现原理。Clangclang是XCode的编译器前端,编译...

2017-04-17 14:24:44 5917 4

原创 深入理解Objective C的ARC机制

从Runtime源码和汇编的角度深入挖掘ARC的本质

2017-04-11 09:05:35 4258 2

原创 iOS 10越狱和Reveal 8分析三方App UI框架教程

前言这是一篇写给开发者的博客,如果碰巧非开发者搜到了这篇博客,那么博客的内容可能不适合你。其实网上Reveal的教程很多,但是很多都是停留在Reveal 1或者Reveal 2时代的博客,不太适合最新版本的Reveal 7,所以还是决定写这样一篇文章。本文最终的效果:淘宝首页: 可以看到,淘宝首页...

2017-04-05 22:27:07 8448 3

原创 详解Swift中的错误处理

前言任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃。良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性。本文的Swift版本:Swift 3Objective C返回nil如果出错了,就返回空是Objective C中的一种常见的处理方式。因为在Objective C中...

2017-03-19 16:49:05 8246 0

原创 iOS自动化测试的那些干货

前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改。 大多数的iOS App(没有持续集成)迭代流程是这样的也就是说,测试是发布之前的最后一道关卡。如果bug不能在测试中发现,那么bug 就会抵达用户,所以测试的完整性和可靠性十分重要。目前,大多数App还停留在人工测试阶段,人工测试投...

2017-03-09 12:08:37 18070 2

原创 优雅的开发Swift和Objective C混编的Framework

前言为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑。用Swift封住哪个OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用...

2017-03-02 16:41:58 11835 17

原创 iOS开发中常用的那些工具

工欲善其事,必先利其器。 列表 XCode 无须多说 Instruments 性能分析工具:卡顿,内存,网络,数据存储等等 xcodebuild and xcrun 命令行工具用来脚本打包和测试 synx 把XCode工程中的Group自动映射到实际的文件夹 oclint 静态分析Objetiv...

2017-02-23 21:17:52 7095 0

原创 React Native开发之快速入门React

前言这篇文章,是接着之前的一篇入门文章写的(虽然已经过去大半年了),本文的受众仍然是React小白,熟悉React的同学可以不看了。上一篇文章链接: 为React Native开发写的JS和React入门知识 上一篇文章主要介绍了JS的语言基础和React的component生命周期。本文会接着上...

2017-01-17 11:27:08 4026 1

原创 GCD精讲(Swift 3&4)

前言我们首先来看一张图:我觉得这张动图很好的诠释了《把一个线程用到死的》核心价值观。很多程序都有一个主线程。对于iOS/MacOS开发来说,这个线程就是UI线程,在这个线程上会做一些用户交互/渲染相关的事情。把过多的任务放在主线程,会导致主线程卡顿,进而用户看到的就是App响应慢,列表滚动的时候掉...

2017-01-09 21:37:50 10882 3

原创 Swift Playground精讲

Playground是啥? Playground是一个强大的工具。对于Swift初学者来说,它简单易用,可以实时预览代码效果,非常适合学习Swift这门语言。在日常开发中,playground可以进行快速的原型开发和试错。当然,playground支持markup标注,用来Swift相关的书籍...

2017-01-01 16:49:16 13146 2

原创 iOS开发 - 在状态栏显示FPS,CPU和内存信息

前言 今天在用Instruments分析App的时候,总感觉看起来不太直观。到Github上找了找,发现几乎都是只显示FPS的,而且效果也不是我想要的。于是就自己写了个 源码地址 LHPerformanceStatusBar 效果字体颜色会根据阈值进行颜色变化,性能差的时候字体会变成红色,性能...

2016-12-26 23:32:31 7815 18

原创 iOS编译过程的原理和应用

前言 一般可以将编程语言分为两种,编译语言和直译式语言。 像C++,Objective C都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。 像JavaScript,Python都是直译式语言。直译式语言不需要经过编译的过程,而是...

2016-12-10 11:58:12 29754 10

原创 Swift进阶之内存模型和方法调度

前言Apple今年推出了Swift3.0,较2.3来说,3.0是一次重大的升级。关于这次更新,在这里都可以找到,最主要的还是提高了Swift的性能,优化了Swift API的设计(命名)规范。前段时间对之前写的一个项目ImageMaskTransition做了简单迁移,先保证能在3.0下正常运行,...

2016-11-13 16:08:01 7574 1

提示
确定要删除当前文章?
取消 删除