<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Leo的专栏]]></title><description><![CDATA[Everything is an experiment, you win or learn~]]></description><link>https://blog.csdn.net/Hello_Hwc</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; Hello_Hwc]]></copyright><item><title><![CDATA[性能深度分析之SystemTrace]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/104738309</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/104738309</guid><author>Hello_Hwc</author><pubDate>Sun, 08 Mar 2020 19:12:00 +0800</pubDate><description><![CDATA[前言
App中大多数的性能指标都和时间相关，如启动速度，列表滑动FPS，页面打开耗时等等。为了优化这些指标，我们需要了解时间都消耗在哪里。
通常我们会打开Time Profiler，通过聚合Call Stack来分析和优化代码耗时。偶尔会出现优化后Time Profiler已经没有什么高耗时的Call Stack，但列表滑动仍然掉帧，这时候应该怎么办呢？
不妨试试System Trace~
一个实...]]></description><category></category></item><item><title><![CDATA[深入理解Symbol]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/103330564</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/103330564</guid><author>Hello_Hwc</author><pubDate>Sat, 30 Nov 2019 23:02:55 +0800</pubDate><description><![CDATA[这里是引用

前言
符号(Symbol)是日常开发中经常接触的一个概念，虽然日常开发中直接应用的场景比较少，但符号编译期和运行时都扮演了重要的角色。
符号是什么
维基百科的定义

A symbol in computer programming is a primitive data type whose instances have a unique human-readable form.
...]]></description><category></category></item><item><title><![CDATA[聊聊应用内购买]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/89441828</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/89441828</guid><author>Hello_Hwc</author><pubDate>Sun, 21 Apr 2019 23:04:31 +0800</pubDate><description><![CDATA[前言
上一份工作中，断断续续开发和维护了两年左右的内购，换工作后短期内应该不会做相关业务了，所以趁着“记忆”还是热乎的，写下这篇文章。
希望读者通过阅读本文能够解决一些问题或者找到一些产品灵感，本文主要包括三个方面：

内购的基本概念；
代码层面如何开发，坑和对应的解决方案；
应用审核和后续运营的注意事项；

友情提示：本文很长～
授之以渔
以下官方资料，建议开发内购的同学静下心来通读一遍，能避免...]]></description><category></category></item><item><title><![CDATA[深入浅出iOS编译]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/85226147</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/85226147</guid><author>Hello_Hwc</author><pubDate>Sun, 23 Dec 2018 20:59:26 +0800</pubDate><description><![CDATA[前言
两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》，这篇文章介绍了iOS编译相关基础知识和简单应用，但也很有多问题都没有解释清楚：

Clang和LLVM究竟是什么
源文件到机器码的细节
Linker做了哪些工作
编译顺序如何确定
头文件是什么？XCode是如何找到头文件的？
Clang Module
签名是什么？为什么要签名

为了搞清楚这些问题，我们来挖掘下XCode编译iO...]]></description><category></category></item><item><title><![CDATA[iOS 性能优化 - TimeProfiler分析代码耗时]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/84311933</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/84311933</guid><author>Hello_Hwc</author><pubDate>Tue, 20 Nov 2018 23:37:02 +0800</pubDate><description><![CDATA[Time Profiler
Time Profiler用来分析代码的执行时间，主要用来分析CPU使用情况。
注意：要在release模式(或者自定义的其他的打包模式)下分析，原因在release模式下：

会开启编译器优化，提高代码运行效率
生成调试的符号表，这样才能够在profile的时候看到代码的调用栈
多数条件编译只会在debug模式下生效，release模式和生产环境是一样的。


Dem...]]></description><category></category></item><item><title><![CDATA[iOS 性能优化 - Allocations分析内存分配]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/83241475</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/83241475</guid><author>Hello_Hwc</author><pubDate>Sun, 21 Oct 2018 14:45:24 +0800</pubDate><description><![CDATA[Allocations
Allocations用来分析静态内存分配。
Demo项目
Demo App
Demo是一个简单的图片应用：首页只有一个简单的入口；次级页面会读取本地页面，加滤镜，然后按照瀑布流的方式显示出来；第三个页面提供大图显示；

运行代码：点击Photos -&amp;amp;gt; 进入main -&amp;amp;gt; 点击一张图，进入详情页 -&amp;amp;gt; Pop直到回到第一个页面，重复这段操作，从XCode...]]></description><category></category></item><item><title><![CDATA[XCode 10打包上传后在iOS 9上Crash（2018）]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/82891405</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/82891405</guid><author>Hello_Hwc</author><pubDate>Fri, 28 Sep 2018 23:12:27 +0800</pubDate><description><![CDATA[问题描述：
XCode 10打包的App在iOS 9上Crash。
原因：
App Store的Bug，上传后的代码经过App Store处理后，加载assets中的图在iOS 9上会Crash。
解决方案：

切回到XCode 9.4打包，前提是你没有用到一些iOS 12的新特性。
弃用Assets，把里面的图（除了icon和launch image）拖拽到项目里，按照普通图片的方式使用。
等待...]]></description><category></category></item><item><title><![CDATA[聊聊AppDelegate解耦]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/81609183</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/81609183</guid><author>Hello_Hwc</author><pubDate>Sun, 12 Aug 2018 18:52:46 +0800</pubDate><description><![CDATA[AppDelegate

在iOS开发中，AppDelegate指的是UIApplicationDelegate，用来处理App层面的事件，包括生命周期变化，OpenURL，处理HandOff和Intent等。

每个iOS都有一个入口函数main，其中的一个参数就是AppDelegate：

int main(int argc, char *argv[])
{
    @autoreleasep...]]></description><category></category></item><item><title><![CDATA[实现一个优雅的iOS事件总线]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/81023561</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/81023561</guid><author>Hello_Hwc</author><pubDate>Thu, 12 Jul 2018 22:33:40 +0800</pubDate><description><![CDATA[目标

订阅登录事件LoginEvent，当self dealloc时候自动取消订阅



[QTSub(self, LoginEvent) next:^(LoginEvent *event) {

}];

订阅通知NSNotification，当self dealloc的时候自动取消订阅



//订阅通知name
[QTSubNoti(self,&quot;name&quot;) next:^(NSNotifi...]]></description><category></category></item><item><title><![CDATA[深入理解iOS Crash Log]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/80946318</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/80946318</guid><author>Hello_Hwc</author><pubDate>Fri, 06 Jul 2018 21:11:36 +0800</pubDate><description><![CDATA[Crash Log

Crash Log的主要来源有两种：


Apple提供的，可以从用户设备中直接拷贝，或者从iTunes Connect（XCode）下载
三方或者自研Framework统计，三方服务包括Fabric，Bugly等。


这篇文章讲到的Crash Log是Apple提供的。



获取



设备获取

USB连接设备，接着在XCode菜单栏依次选择：Window -&amp;gt;...]]></description><category></category></item><item><title><![CDATA[XCode启动参数和环境变量]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/80865787</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/80865787</guid><author>Hello_Hwc</author><pubDate>Sat, 30 Jun 2018 12:54:57 +0800</pubDate><description><![CDATA[前言

这一部分介绍XCode中Argument/Options模块，通过这两个模块，我们可以在启动App的时候传递一些额外的参数进去，覆盖系统的默认值，从而实现特定场景的调试。



Options

Options这里的内容相对简单，但是却容易被忽略。




Core Location用来模拟App的位置
Application Data 可以用于测试CoreData的Scheme迁移
Ro...]]></description><category></category></item><item><title><![CDATA[Safari/Chrome调试WebView]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/80721246</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/80721246</guid><author>Hello_Hwc</author><pubDate>Sun, 17 Jun 2018 21:51:07 +0800</pubDate><description><![CDATA[前言

最近在写《iOS代码调试》系列的博客，估计会有十篇以上的内容，等到都写完了会在Github开源出来，欢迎关注我的Github：


LeoMobileDeveloper


WebView

大多数App会选择H5去实现某些弱交互但是却需要热更新界面，这时候WebView就派上用场了，那么如何对WebView进行调试呢？

Safari

开启开发菜单

Safari -&amp;amp;amp;amp;gt; 偏好设置...]]></description><category></category></item><item><title><![CDATA[深入理解Toll-Free Bridging]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/80094632</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/80094632</guid><author>Hello_Hwc</author><pubDate>Thu, 26 Apr 2018 15:28:28 +0800</pubDate><description><![CDATA[前言

Toll-Free Bridging本身不是什么新技术，那为什么还要写这篇博客呢？

原因是今天和一个同事讨论到相关问题的时候，发现理解并不够深入，于是仔细研究了下，整理成了这篇博客。

本文的Github地址：LeoMobileDeveloper



Toll-Free Bridging是什么？

摘自文档：


  There are a number of data types i...]]></description><category></category></item><item><title><![CDATA[iOS汇编精讲（上篇）]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/80028030</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/80028030</guid><author>Hello_Hwc</author><pubDate>Sat, 21 Apr 2018 12:11:32 +0800</pubDate><description><![CDATA[前言

日常的应用开发中，主要用的语言是Objective(Swift)，一些特殊场景下，可能还会用到C/C++，JavaScript，Shell，Python等。

那么，一个iOS开发者为什么要了解汇编这么底层的语言呢？


  因为看得懂汇编能够提高的代码调试和逆向能力。


本文是作者学习汇编过程中整理的笔记，分为上下两篇：上篇主要是一些基础准备，下篇介绍Objective C汇编和一些逆...]]></description><category></category></item><item><title><![CDATA[Sqlite的事务,锁和WAL模式]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/79647470</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/79647470</guid><author>Hello_Hwc</author><pubDate>Wed, 21 Mar 2018 22:49:14 +0800</pubDate><description><![CDATA[前言

事务定义了一组SQL语句的边界，这组SQL语句要么都执行，要么都不执行，事务保证了数据库完整性中的原子性。事务与数据库锁是紧密相关的，Sqlite用锁来保证事务的并发和执行顺序。



事务

在讲解事务的原理之前，我们先看看事务相关的API，主要有三个：


begin transaction 开始一个事务。其中，transaction可省略，直接写begin即可。
rollback 回...]]></description><category></category></item><item><title><![CDATA[Objective C范型]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/78994822</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/78994822</guid><author>Hello_Hwc</author><pubDate>Sun, 07 Jan 2018 14:51:16 +0800</pubDate><description><![CDATA[范型

范型编程是一种程序语言设计范式，它允许程序员在使用强类型的语言编写代码的时候，延迟确定具体的类型。

以Swift代码为例，假如有一个需求是要交换两个int,很容易写出类似代码



func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}]]></description><category></category></item><item><title><![CDATA[新年快乐]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/78943346</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/78943346</guid><author>Hello_Hwc</author><pubDate>Sun, 31 Dec 2017 21:33:10 +0800</pubDate><description><![CDATA[新年快乐]]></description><category></category></item><item><title><![CDATA[Fishhook替换C函数的原理]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/78444203</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/78444203</guid><author>Hello_Hwc</author><pubDate>Sat, 04 Nov 2017 16:17:48 +0800</pubDate><description><![CDATA[FishhookFishhook是FaceBook出品的，可以用来Hook C函数的一个开源库。它的主要接口就一个：struct rebinding {
  const char *name; //字符串名称
  void *replacement; //替换后的方法
  void **replaced; //原始的方法（通常要存储下来，在替换后的方法里调用）
};//两个参数分别是rebindin]]></description><category></category></item><item><title><![CDATA[深入理解iOS App的启动过程]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/78317863</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/78317863</guid><author>Hello_Hwc</author><pubDate>Mon, 23 Oct 2017 13:28:28 +0800</pubDate><description><![CDATA[前言
  启动时间是衡量应用品质的重要指标。
本文首先会从原理上出发，讲解iOS系统是如何启动App的，然后从main函数之前和main函数之后两个角度去分析如何优化启动时间。准备知识Mach-O哪些名词指的是Mach-o
Executable 可执行文件
Dylib 动态库
Bundle 无法被连接的动态库，只能通过dlopen()加载
Image 指的是Executable，Dylib或者Bun]]></description><category></category></item><item><title><![CDATA[聊聊SQLite - 基础篇]]></title><link>https://blog.csdn.net/Hello_Hwc/article/details/78077206</link><guid>https://blog.csdn.net/Hello_Hwc/article/details/78077206</guid><author>Hello_Hwc</author><pubDate>Sun, 24 Sep 2017 15:38:39 +0800</pubDate><description><![CDATA[SQLite

SQLite是一个关系型数据库，是一个嵌入式的数据库，它的核心代码由C编写，直接在宿主应用中运行。

本来想一篇长文章涵盖想写的内容，最后发现想写的东西太多了，就拆分成：基础篇，原理篇和iOS应用篇发出来吧。

MAC OS的命令行字带SQLite。以下示例均在命令行中进行，C API的使用会在之后的文章里讲解：



表


  在关系型数据库中，表是一组相关数据的集合，它包括行]]></description><category></category></item></channel></rss>