性能深度分析之SystemTrace 前言App中大多数的性能指标都和时间相关,如启动速度,列表滑动FPS,页面打开耗时等等。为了优化这些指标,我们需要了解时间都消耗在哪里。通常我们会打开Time Profiler,通过聚合Call Stack来分析和优化代码耗时。偶尔会出现优化后Time Profiler已经没有什么高耗时的Call Stack,但列表滑动仍然掉帧,这时候应该怎么办呢?不妨试试System Trace~一个实...
深入理解Symbol 这里是引用前言符号(Symbol)是日常开发中经常接触的一个概念,虽然日常开发中直接应用的场景比较少,但符号编译期和运行时都扮演了重要的角色。符号是什么维基百科的定义A symbol in computer programming is a primitive data type whose instances have a unique human-readable form....
聊聊应用内购买 前言上一份工作中,断断续续开发和维护了两年左右的内购,换工作后短期内应该不会做相关业务了,所以趁着“记忆”还是热乎的,写下这篇文章。希望读者通过阅读本文能够解决一些问题或者找到一些产品灵感,本文主要包括三个方面:内购的基本概念;代码层面如何开发,坑和对应的解决方案;应用审核和后续运营的注意事项;友情提示:本文很长~授之以渔以下官方资料,建议开发内购的同学静下心来通读一遍,能避免...
深入浅出iOS编译 前言两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚:Clang和LLVM究竟是什么源文件到机器码的细节Linker做了哪些工作编译顺序如何确定头文件是什么?XCode是如何找到头文件的?Clang Module签名是什么?为什么要签名为了搞清楚这些问题,我们来挖掘下XCode编译iO...
iOS 性能优化 - TimeProfiler分析代码耗时 Time ProfilerTime Profiler用来分析代码的执行时间,主要用来分析CPU使用情况。注意:要在release模式(或者自定义的其他的打包模式)下分析,原因在release模式下:会开启编译器优化,提高代码运行效率生成调试的符号表,这样才能够在profile的时候看到代码的调用栈多数条件编译只会在debug模式下生效,release模式和生产环境是一样的。Dem...
iOS 性能优化 - Allocations分析内存分配 AllocationsAllocations用来分析静态内存分配。Demo项目Demo AppDemo是一个简单的图片应用:首页只有一个简单的入口;次级页面会读取本地页面,加滤镜,然后按照瀑布流的方式显示出来;第三个页面提供大图显示;运行代码:点击Photos -> 进入main -> 点击一张图,进入详情页 -> Pop直到回到第一个页面,重复这段操作,从XCode...
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)拖拽到项目里,按照普通图片的方式使用。等待...
聊聊AppDelegate解耦 AppDelegate在iOS开发中,AppDelegate指的是UIApplicationDelegate,用来处理App层面的事件,包括生命周期变化,OpenURL,处理HandOff和Intent等。每个iOS都有一个入口函数main,其中的一个参数就是AppDelegate:int main(int argc, char *argv[]){ @autoreleasep...
实现一个优雅的iOS事件总线 目标订阅登录事件LoginEvent,当self dealloc时候自动取消订阅[QTSub(self, LoginEvent) next:^(LoginEvent *event) {}];订阅通知NSNotification,当self dealloc的时候自动取消订阅//订阅通知name[QTSubNoti(self,"name") next:^(NSNotifi...
深入理解iOS Crash Log Crash LogCrash Log的主要来源有两种:Apple提供的,可以从用户设备中直接拷贝,或者从iTunes Connect(XCode)下载三方或者自研Framework统计,三方服务包括Fabric,Bugly等。这篇文章讲到的Crash Log是Apple提供的。获取设备获取USB连接设备,接着在XCode菜单栏依次选择:Window ->...
XCode启动参数和环境变量 前言这一部分介绍XCode中Argument/Options模块,通过这两个模块,我们可以在启动App的时候传递一些额外的参数进去,覆盖系统的默认值,从而实现特定场景的调试。OptionsOptions这里的内容相对简单,但是却容易被忽略。Core Location用来模拟App的位置Application Data 可以用于测试CoreData的Scheme迁移Ro...
Safari/Chrome调试WebView 前言最近在写《iOS代码调试》系列的博客,估计会有十篇以上的内容,等到都写完了会在Github开源出来,欢迎关注我的Github:LeoMobileDeveloperWebView大多数App会选择H5去实现某些弱交互但是却需要热更新界面,这时候WebView就派上用场了,那么如何对WebView进行调试呢?Safari开启开发菜单Safari -> 偏好设置...
深入理解Toll-Free Bridging 前言Toll-Free Bridging本身不是什么新技术,那为什么还要写这篇博客呢?原因是今天和一个同事讨论到相关问题的时候,发现理解并不够深入,于是仔细研究了下,整理成了这篇博客。本文的Github地址:LeoMobileDeveloperToll-Free Bridging是什么?摘自文档: There are a number of data types i...
iOS汇编精讲(上篇) 前言日常的应用开发中,主要用的语言是Objective(Swift),一些特殊场景下,可能还会用到C/C++,JavaScript,Shell,Python等。那么,一个iOS开发者为什么要了解汇编这么底层的语言呢? 因为看得懂汇编能够提高的代码调试和逆向能力。本文是作者学习汇编过程中整理的笔记,分为上下两篇:上篇主要是一些基础准备,下篇介绍Objective C汇编和一些逆...
Sqlite的事务,锁和WAL模式 前言事务定义了一组SQL语句的边界,这组SQL语句要么都执行,要么都不执行,事务保证了数据库完整性中的原子性。事务与数据库锁是紧密相关的,Sqlite用锁来保证事务的并发和执行顺序。事务在讲解事务的原理之前,我们先看看事务相关的API,主要有三个:begin transaction 开始一个事务。其中,transaction可省略,直接写begin即可。rollback 回...
Objective C范型 范型范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA}