- 博客(302)
- 资源 (33)
- 收藏
- 关注
原创 性能深度分析之SystemTrace
前言App中大多数的性能指标都和时间相关,如启动速度,列表滑动FPS,页面打开耗时等等。为了优化这些指标,我们需要了解时间都消耗在哪里。通常我们会打开Time Profiler,通过聚合Call Stack来分析和优化代码耗时。偶尔会出现优化后Time Profiler已经没有什么高耗时的Call Stack,但列表滑动仍然掉帧,这时候应该怎么办呢?不妨试试System Trace~一个实...
2020-03-08 19:12:00
7039
7
原创 深入理解Symbol
这里是引用前言符号(Symbol)是日常开发中经常接触的一个概念,虽然日常开发中直接应用的场景比较少,但符号编译期和运行时都扮演了重要的角色。符号是什么维基百科的定义A symbol in computer programming is a primitive data type whose instances have a unique human-readable form....
2019-11-30 23:02:55
7474
2
原创 聊聊应用内购买
前言上一份工作中,断断续续开发和维护了两年左右的内购,换工作后短期内应该不会做相关业务了,所以趁着“记忆”还是热乎的,写下这篇文章。希望读者通过阅读本文能够解决一些问题或者找到一些产品灵感,本文主要包括三个方面:内购的基本概念;代码层面如何开发,坑和对应的解决方案;应用审核和后续运营的注意事项;友情提示:本文很长~授之以渔以下官方资料,建议开发内购的同学静下心来通读一遍,能避免...
2019-04-21 23:04:31
20631
9
原创 深入浅出iOS编译
前言两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚:Clang和LLVM究竟是什么源文件到机器码的细节Linker做了哪些工作编译顺序如何确定头文件是什么?XCode是如何找到头文件的?Clang Module签名是什么?为什么要签名为了搞清楚这些问题,我们来挖掘下XCode编译iO...
2018-12-23 20:59:26
19950
8
原创 iOS 性能优化 - TimeProfiler分析代码耗时
Time ProfilerTime Profiler用来分析代码的执行时间,主要用来分析CPU使用情况。注意:要在release模式(或者自定义的其他的打包模式)下分析,原因在release模式下:会开启编译器优化,提高代码运行效率生成调试的符号表,这样才能够在profile的时候看到代码的调用栈多数条件编译只会在debug模式下生效,release模式和生产环境是一样的。Dem...
2018-11-20 23:37:02
7988
原创 iOS 性能优化 - Allocations分析内存分配
AllocationsAllocations用来分析静态内存分配。Demo项目Demo AppDemo是一个简单的图片应用:首页只有一个简单的入口;次级页面会读取本地页面,加滤镜,然后按照瀑布流的方式显示出来;第三个页面提供大图显示;运行代码:点击Photos -> 进入main -> 点击一张图,进入详情页 -> Pop直到回到第一个页面,重复这段操作,从XCode...
2018-10-21 14:45:24
7579
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的新特性。弃用Assets,把里面的图(除了icon和launch image)拖拽到项目里,按照普通图片的方式使用。等待...
2018-09-28 23:12:27
5008
2
原创 聊聊AppDelegate解耦
AppDelegate在iOS开发中,AppDelegate指的是UIApplicationDelegate,用来处理App层面的事件,包括生命周期变化,OpenURL,处理HandOff和Intent等。每个iOS都有一个入口函数main,其中的一个参数就是AppDelegate:int main(int argc, char *argv[]){ @autoreleasep...
2018-08-12 18:52:46
26972
原创 实现一个优雅的iOS事件总线
目标订阅登录事件LoginEvent,当self dealloc时候自动取消订阅[QTSub(self, LoginEvent) next:^(LoginEvent *event) {}];订阅通知NSNotification,当self dealloc的时候自动取消订阅//订阅通知name[QTSubNoti(self,"name") next:^(NSNotifi...
2018-07-12 22:33:40
7680
7
原创 深入理解iOS Crash Log
Crash LogCrash Log的主要来源有两种:Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载三方或者自研Framework统计,三方服务包括Fabric,Bugly等。这篇文章讲到的Crash Log是Apple提供的。获取设备获取USB连接设备,接着在XCode菜单栏依次选择:Window ->...
2018-07-06 21:11:36
30458
4
原创 XCode启动参数和环境变量
前言这一部分介绍XCode中Argument/Options模块,通过这两个模块,我们可以在启动App的时候传递一些额外的参数进去,覆盖系统的默认值,从而实现特定场景的调试。OptionsOptions这里的内容相对简单,但是却容易被忽略。Core Location用来模拟App的位置Application Data 可以用于测试CoreData的Scheme迁移Ro...
2018-06-30 12:54:57
5985
原创 Safari/Chrome调试WebView
前言最近在写《iOS代码调试》系列的博客,估计会有十篇以上的内容,等到都写完了会在Github开源出来,欢迎关注我的Github:LeoMobileDeveloperWebView大多数App会选择H5去实现某些弱交互但是却需要热更新界面,这时候WebView就派上用场了,那么如何对WebView进行调试呢?Safari开启开发菜单Safari -> 偏好设置...
2018-06-17 21:51:07
12647
原创 深入理解Toll-Free Bridging
前言Toll-Free Bridging本身不是什么新技术,那为什么还要写这篇博客呢?原因是今天和一个同事讨论到相关问题的时候,发现理解并不够深入,于是仔细研究了下,整理成了这篇博客。本文的Github地址:LeoMobileDeveloperToll-Free Bridging是什么?摘自文档: There are a number of data types i...
2018-04-26 15:28:28
4581
4
原创 iOS汇编精讲(上篇)
前言日常的应用开发中,主要用的语言是Objective(Swift),一些特殊场景下,可能还会用到C/C++,JavaScript,Shell,Python等。那么,一个iOS开发者为什么要了解汇编这么底层的语言呢? 因为看得懂汇编能够提高的代码调试和逆向能力。本文是作者学习汇编过程中整理的笔记,分为上下两篇:上篇主要是一些基础准备,下篇介绍Objective C汇编和一些逆...
2018-04-21 12:11:32
6928
3
原创 Sqlite的事务,锁和WAL模式
前言事务定义了一组SQL语句的边界,这组SQL语句要么都执行,要么都不执行,事务保证了数据库完整性中的原子性。事务与数据库锁是紧密相关的,Sqlite用锁来保证事务的并发和执行顺序。事务在讲解事务的原理之前,我们先看看事务相关的API,主要有三个:begin transaction 开始一个事务。其中,transaction可省略,直接写begin即可。rollback 回...
2018-03-21 22:49:14
3896
原创 Objective C范型
范型范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA}
2018-01-07 14:51:16
3221
原创 Fishhook替换C函数的原理
FishhookFishhook是FaceBook出品的,可以用来Hook C函数的一个开源库。它的主要接口就一个:struct rebinding { const char *name; //字符串名称 void *replacement; //替换后的方法 void **replaced; //原始的方法(通常要存储下来,在替换后的方法里调用)};//两个参数分别是rebindin
2017-11-04 16:17:48
6678
1
原创 深入理解iOS App的启动过程
前言 启动时间是衡量应用品质的重要指标。本文首先会从原理上出发,讲解iOS系统是如何启动App的,然后从main函数之前和main函数之后两个角度去分析如何优化启动时间。准备知识Mach-O哪些名词指的是Mach-oExecutable 可执行文件Dylib 动态库Bundle 无法被连接的动态库,只能通过dlopen()加载Image 指的是Executable,Dylib或者Bun
2017-10-23 13:28:28
27327
14
原创 聊聊SQLite - 基础篇
SQLiteSQLite是一个关系型数据库,是一个嵌入式的数据库,它的核心代码由C编写,直接在宿主应用中运行。本来想一篇长文章涵盖想写的内容,最后发现想写的东西太多了,就拆分成:基础篇,原理篇和iOS应用篇发出来吧。MAC OS的命令行字带SQLite。以下示例均在命令行中进行,C API的使用会在之后的文章里讲解:表 在关系型数据库中,表是一组相关数据的集合,它包括行
2017-09-24 15:38:39
1811
原创 Moya的设计之道
前言 Moya是一个基于Alamofire开发的,轻量级的Swift网络层。Moya的可扩展性非常强,可以方便的RXSwift,PromiseKit和ObjectMapper结合。如果你的项目刚刚搭建,并且是纯Swift的,非常推荐以Moya为核心去搭建你的网络层。另外,如果你对Alamofire的源码感兴趣,推荐我之前的一篇博客:Alamofire的设计之道 Moya除了依赖Alamof
2017-08-11 13:44:52
8977
18
原创 实现60fps的网易云音乐首页
前言网易云音乐是一款很优秀的音乐软件,我也是它的忠实用户。最近在研究如何更好的开发TableView,接着我写了一个Model驱动的小框架 - MDTable。为了去验证框架的可用性,我选择了网易云音乐的首页来作为Demo,语言是Swift 3。本文的内容包括:实现网易云音乐首页的思路如何建立一个轻量级的UITableViewController(不到100行)性能瓶颈原因以分析及如何优化到接
2017-07-28 14:38:34
6092
6
原创 理解网络分层与数据加密
网络分层网络的基础分层是OSI的七层架构: OSI的全称是Open System Interconnection(开放系统互联模型),是由国际标准化组织ISO设计,解决不同体系结构网络互相连接的问题。实际应用中,五层架构是最常见的,也是最容易理解的:网络分层后,每一层都工作着不同的协议和实际的物理设备,下一层为上一层提供服务,上层的实现无需考虑下层的细节,相同层级之间进行相互通信。物理层
2017-07-22 20:29:34
5339
原创 优雅的开发TableView
前言UITableView(UITableViewController)是iOS开发使用频率最高的一个组件。不管是使用UITableView还是还是UITableViewController,在开发的时候,我们都需要实现两个协议:UITableViewControllerDataSourceUITableViewControllerDelegate这两个协议的代码不是写在Controller里
2017-06-19 11:57:34
7266
2
原创 MVVM与Controller瘦身实践
前言MVC是一个做iOS开发都知道的设计模式,也是Apple官方推荐的设计模式。实际上,Cocoa Touch就是按照MVC来设计的。这里,我们先不讲MVC是什么,我们先来谈谈软件设计的一些原则或者说理念。在开发App的时候,我们的基本目标有以下几点:可靠性 - App的功能能够正常使用健壮性 - 在用户非正常使用的时候,app也能够正常反应,不要崩溃效率性 - 启动时间,耗电,流量,界面反应
2017-06-12 11:20:19
11338
1
原创 Alamofire的设计之道
前言:Alamofire是一个由Swift编写的优雅的网络开发框架。大部分用Swift编写的iOS App的网络模块都是基于Alamofire的。作为Swift社区最活跃的几个项目之一,有许多开发者在不断的对其进行完善,所以学习这种优秀的开源代码对深入理解Swift的特性很有帮助。
2017-06-03 18:54:52
12919
原创 消息转发机制与Aspects源码解析
前言最近在搞重构相关的事情,遇到了不少这样的场景: 进入一个界面,在viewWillAppear:的时候做相应判断,如果满足条件则执行对应代码。这类业务有一个特点,业务内容是对应整个App的,与对应的ViewController毛关系都没有,但是却不得不耦合到(即使是调用代码可以精简到一行)ViewController中。我们都知道,这种类似的业务用AOP(面向切片编程)来做十分适合,所谓面向
2017-05-22 22:55:51
4390
2
原创 Objective C block背后的黑魔法
前言block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用。那么block这套机制在Objective C中是如何实现的呢?本文通过从C/C++到汇编层面分析block的实现原理。Clangclang是XCode的编译器前端,编译器前端负责语法分析,语义分析,生成中间代码(intermediate representation )。
2017-04-17 14:24:44
6776
2
原创 iOS 10越狱和Reveal 8分析三方App UI框架教程
前言这是一篇写给开发者的博客,如果碰巧非开发者搜到了这篇博客,那么博客的内容可能不适合你。其实网上Reveal的教程很多,但是很多都是停留在Reveal 1或者Reveal 2时代的博客,不太适合最新版本的Reveal 7,所以还是决定写这样一篇文章。本文最终的效果:淘宝首页:可以看到,淘宝首页其实就是一个巨大的CollectionView京东首页:可以看到,京东首页其实就是一个巨大的Tabl
2017-04-05 22:27:07
9572
原创 详解Swift中的错误处理
前言任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃。良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性。本文的Swift版本:Swift 3Objective C返回nil如果出错了,就返回空是Objective C中的一种常见的处理方式。因为在Objective C中,向nil发送消息是安全的。比如:- (instancetype)init{ self = [
2017-03-19 16:49:05
10363
原创 iOS自动化测试的那些干货
前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改。大多数的iOS App(没有持续集成)迭代流程是这样的也就是说,测试是发布之前的最后一道关卡。如果bug不能在测试中发现,那么bug 就会抵达用户,所以测试的完整性和可靠性十分重要。目前,大多数App还停留在人工测试阶段,人工测试投入的成本最低,能够保证核心功能的使用,而且测试人员不需要会写代码。但是,在很多测试场景下,人工测试的效率
2017-03-09 12:08:37
21360
3
原创 优雅的开发Swift和Objective C混编的Framework
前言为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑。用Swift封住哪个OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用Swift重写代价太大。这就引入了一个需求:用Swift和OC来混编一个Framework。如果你之
2017-03-02 16:41:58
14437
2
原创 iOS开发中常用的那些工具
工欲善其事,必先利其器。列表XCode 无须多说Instruments 性能分析工具:卡顿,内存,网络,数据存储等等xcodebuild and xcrun 命令行工具用来脚本打包和测试synx 把XCode工程中的Group自动映射到实际的文件夹oclint 静态分析Objetive C代码,发现隐藏问题xctool 基于xcodebuild的扩展,更方便的使用命令行测试Char
2017-02-23 21:17:52
7949
原创 React Native开发之快速入门React
前言这篇文章,是接着之前的一篇入门文章写的(虽然已经过去大半年了),本文的受众仍然是React小白,熟悉React的同学可以不看了。上一篇文章链接:为React Native开发写的JS和React入门知识上一篇文章主要介绍了JS的语言基础和React的component生命周期。本文会接着上一篇文章,继续讲解React的基础。本文的React Native版本是0.0.40,开发IDE是Ato
2017-01-17 11:27:08
4787
原创 GCD精讲(Swift 3&4)
前言我们首先来看一张图:我觉得这张动图很好的诠释了《把一个线程用到死的》核心价值观。很多程序都有一个主线程。对于iOS/MacOS开发来说,这个线程就是UI线程,在这个线程上会做一些用户交互/渲染相关的事情。把过多的任务放在主线程,会导致主线程卡顿,进而用户看到的就是App响应慢,列表滚动的时候掉帧。把任务分散到多个线程执行有很多种技术,在iOS/MacOS App开发中,最简单直观的就是GCD(又
2017-01-09 21:37:50
12618
1
原创 Swift Playground精讲
Playground是啥? Playground是一个强大的工具。对于Swift初学者来说,它简单易用,可以实时预览代码效果,非常适合学习Swift这门语言。在日常开发中,playground可以进行快速的原型开发和试错。当然,playground支持markup标注,用来Swift相关的书籍也不错。基础讲解工欲善其事,必先利其器首先,我们先来熟悉下Playground的IDE,这是官方给出的
2017-01-01 16:49:16
17236
原创 iOS开发 - 在状态栏显示FPS,CPU和内存信息
前言 今天在用Instruments分析App的时候,总感觉看起来不太直观。到Github上找了找,发现几乎都是只显示FPS的,而且效果也不是我想要的。于是就自己写了个源码地址LHPerformanceStatusBar效果字体颜色会根据阈值进行颜色变化,性能差的时候字体会变成红色,性能一般的时候会变成橘黄色,阈值可配。集成CocoaPod集成pod LHPerformanceStatus
2016-12-26 23:32:31
9156
18
原创 iOS编译过程的原理和应用
前言一般可以将编程语言分为两种,编译语言和直译式语言。像C++,Objective C都是编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在CPU上执行,所以执行效率较高。像JavaScript,Python都是直译式语言。直译式语言不需要经过编译的过程,而是在执行的时候通过一个中间的解释器将代码解释为CPU可以执行的代码。所以,较编译语言来说,直译式语言效率
2016-12-10 11:58:12
34862
2
原创 Swift进阶之内存模型和方法调度
前言Apple今年推出了Swift3.0,较2.3来说,3.0是一次重大的升级。关于这次更新,在这里都可以找到,最主要的还是提高了Swift的性能,优化了Swift API的设计(命名)规范。前段时间对之前写的一个项目ImageMaskTransition做了简单迁移,先保证能在3.0下正常运行,只用了不到30分钟。总的来说,这次迁移还是非常轻松的。但是,有一点要注意:3.0的API设计规范较2.3
2016-11-13 16:08:01
9720
CoreData与Tableview的Demo
2015-05-21
IBInspectableAndIBDesignableDemo
2015-04-26
IOS网络开发NSURLSession的Demo(上传+下载)
2015-04-02
IOS 使用相机拍照和自定义拍照界面
2015-04-01
自定义UIAlertview的Demo
2015-02-18
UIDynamic Animation Demo
2015-02-07
CoreAnimationDemo(二)用UIKit来实现
2015-01-31
Swift实现淘宝和大众点评下拉刷新
2016-07-16
Swift实现下拉刷新,上拉加载,左/右滑动加载更多
2016-07-14
自定义转场博客的最初项目(配合博客使用)
2016-04-19
SpotLight搜索
2015-12-19
ContactsFramework的Demo(Swift,通讯录)
2015-11-28
AVPlayer播放视频的简单Demo
2015-10-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人