<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[小马哥好棒哦]]></title><description><![CDATA[开发过程中总结的一些东西分享给大家,共同进步~]]></description><link>https://blog.youkuaiyun.com/MPK_Github</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; MPK_Github]]></copyright><item><title><![CDATA[主线程是如何切换runloop的探究]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/121253122</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/121253122</guid><author>MPK_Github</author><pubDate>Wed, 10 Nov 2021 17:39:52 +0800</pubDate><description><![CDATA[对RunLoop运行机制不熟悉的可以先看我的这篇文章:深入理解RunLoop

我们都知道，iOS的tableView能做到滑动很平滑，一部分是依赖于runloop的mode的切换。当系统检测到有scrollerview滑动时，系统就会将当前进程的主线程切换到UITrackingRunLoopMode,直到滑动结束，又会切换到NSDefaultRunLoopMode。这个过程听起来很奇妙，那么他是怎么做到的呢，我们能不能在需要的时候也这么做呢？

答案是肯定的，我们可以模拟这个过程，我的思路是这样的：由于主]]></description><category></category></item><item><title><![CDATA[app耗电检测分析以及优化]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120718666</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120718666</guid><author>MPK_Github</author><pubDate>Tue, 12 Oct 2021 10:33:39 +0800</pubDate><description><![CDATA[耗电量不仅是衡量应用性能表现的一个重要指标，同时也是用户体验的重要组成部分。要做好⼀款APP，不仅仅是实现功能那么简单，我们需要考虑很多性能指标，让用户用的更爽。在开发过程中，要充分考虑到各项性能指标，比如定位精度，更高的精度，往往意味着更高的能耗，因此要平衡好精度和功耗，避免我们的APP过多的电量消耗。

耗电量基本概念

1.What Is Energy？



Idle状态说明 app 处于休眠状态，几乎不使用电量。
	Active状态说明 app 处于前台工作状态，用电量⽐较高，我们可以看到图中的第]]></description><category></category></item><item><title><![CDATA[iOS的包瘦身实践]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120718192</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120718192</guid><author>MPK_Github</author><pubDate>Tue, 12 Oct 2021 10:19:34 +0800</pubDate><description><![CDATA[随着业务的快速增加，商城App的大小也在迅速增加，一度超过了300M。安装包大小的不断增加对App下载成本，推广效率产生了比较大的影响。从2018年9月份我们对商城App开始了为期二期的专项瘦身工作：一期从V7.2.0-V7.5.2版本，共计瘦身46M（设备：iPhone X，iOS12）。为了进一步减小包大小，同时为了建立长效机制，从今年5月份开始了第二期的专项优化工作，二期优化从最高的V8.1.0版本的272M到现在的V8.4.0的214.4M共计已经完成瘦身57.6M，当然二期优化还在继续推进中。瘦身]]></description><category></category></item><item><title><![CDATA[HTTPS的原理]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120554021</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120554021</guid><author>MPK_Github</author><pubDate>Wed, 29 Sep 2021 18:30:46 +0800</pubDate><description><![CDATA[概述

http（HyperText Transfer Protocol，超文本传输协议）协议是互联网中位于协议栈顶层最重要的网络协议之一，它规定了如何在互联网中传输超文本（含有指向其它文本文件链接的文本），而超文本是互联网中数据传输的主要形式。

https = http + secure（安全层），https是由http协议加上安全传输协议SSL/TLS组成的，用于在互联网中安全地传输数据。

下面我们就一起来看这两个协议的基本原理。

http篇

在了解http协议如何工作之前，我们首先需要对网络协]]></description><category></category></item><item><title><![CDATA[Apple安全性]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120553332</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120553332</guid><author>MPK_Github</author><pubDate>Wed, 29 Sep 2021 17:47:49 +0800</pubDate><description><![CDATA[Apple应用打包上传AppStore以及早些时候的真机调试都需要在Apple开发者平台上进行很多操作，比如：上传certSigningRequest文件，生成cer证书，配置Identifiers、Devices，生成mobileprovision文件，安装cer证书，导出p12文件等等。你可曾考虑过Apple为什么要求开发者做这些繁琐的操作，这些文件有什么用，它们又包含了什么信息呢？接下来我会用图文形式由浅入深地介绍一下所有相关知识。通过了解该知识，初级iOS开发者可以充分理解Apple证书配置过程中发]]></description><category></category></item><item><title><![CDATA[app启动时间优化]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120545435</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120545435</guid><author>MPK_Github</author><pubDate>Wed, 29 Sep 2021 11:34:19 +0800</pubDate><description><![CDATA[1.背景

之前通过用户反馈平台发现有部分用户反馈我们的App 启动时间较长，同时从崩溃数据监控发现部分用户在App启动后崩溃， 通过日志排查我们发现崩溃的原因是App启动超时被系统kill掉了，于是我们开始分析项目中导致启动时间变长的原因，并对启动时间进行优化。

2.现状分析

当用户按下home键的时候，iOS的App并不会马上被kill掉，还会继续存活若干时间。理想情况下，用户点击App的图标再次回来的时候，App几乎不需要做什么，就可以还原到退出前的状态，继续为用户服务。这种持续存活的情况下启动A]]></description><category></category></item><item><title><![CDATA[应用程序启动类的分析]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120523584</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120523584</guid><author>MPK_Github</author><pubDate>Tue, 28 Sep 2021 10:14:21 +0800</pubDate><description><![CDATA[当用户点击应用图标之后，应用就开始启动。应用启动完成后，就会展示一系列的视图，和用户进行各种各样的交互（如滑动、点击）。当用户退出应用后，该应用就无法和用户进行交互。这一过程就体现了一个应用的生命周期（从启动到退出）。这里只介绍应用程序的显示部分。

 在介绍应用启动过程及原理之前，先来了解一些概念以及其作用。

1、UIApplication

 UIApplication对象是应用程序的象征，一个UIApplication对象就代表一个应用程序。每一个应用都有自己的UIApplic...]]></description><category></category></item><item><title><![CDATA[iOS之KVC赋值和取值的过程]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/120342201</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/120342201</guid><author>MPK_Github</author><pubDate>Fri, 17 Sep 2021 09:27:07 +0800</pubDate><description><![CDATA[Getter

以下是valueForKey:方法的默认实现，给定一个key作为输入参数，在消息接收者类中操作，执行以下过程。


	① 按照get&lt;Key&gt;、&lt;key&gt;、is&lt;Key&gt;、_&lt;key&gt;顺序查找方法。
	如果找到就调用取值并执行 ⑤，否则执行 ②；
	
	
	② 查找countOf&lt;Key&gt;、objectIn&lt;Key&gt;AtIndex:、&lt;key&gt;AtIndexes:命名的方法。
	如果找到第一个...]]></description><category></category></item><item><title><![CDATA[IOS热更新的原理]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/116589655</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/116589655</guid><author>MPK_Github</author><pubDate>Mon, 10 May 2021 10:49:07 +0800</pubDate><description><![CDATA[1、首先来介绍一下JSCore的原理和通信机制

JSCore 是什么？

大家都知道浏览器内核的模块主要是由渲染引擎和JS 引擎组成，其中 JSCore 就是一种 JS 引擎

Apple 通过将 WebKit 的 JS 引擎用 OC 封装，提供了一套 JS 运行环境以及 Native 与 JS 数据类型之间的转换桥梁，常用于 OC 和 JS 代码之间的相互调用，这也意味着他可以脱离渲染单独去执行 JS。

JSCore 主要包括如下这些 classes、协议、类结构：



JSCore的运行模...]]></description><category></category></item><item><title><![CDATA[ios坐标系的转换方法解析]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/116372606</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/116372606</guid><author>MPK_Github</author><pubDate>Mon, 03 May 2021 10:07:37 +0800</pubDate><description><![CDATA[- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;

- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;

- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;

- (CGRect)convertRect:(CGRect)rect fromVie]]></description><category></category></item><item><title><![CDATA[Block的总结]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114989115</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114989115</guid><author>MPK_Github</author><pubDate>Thu, 18 Mar 2021 20:31:58 +0800</pubDate><description><![CDATA[总结

block的本质就是Objective-C对象，block的调用就是函数指针的调用。

block的本质是一个封装了函数调用以及函数调用环境的OC对象；
	block截获自动变量值的规则：
	局部变量会被直接截获；
		局部静态变量会被截获其指针；
		全局变量并不会被截获，而是直接使用；
	
	block截获对象的规则：
	block位于栈上，则不会对截获的对象变量进行强引用；
		block从栈上复制到堆上，调用copy函数，对截获的变量进行强/弱引用；
		block从堆上移除，调用dispo]]></description><category></category></item><item><title><![CDATA[iOS的事件分发与响应者链]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114854205</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114854205</guid><author>MPK_Github</author><pubDate>Mon, 15 Mar 2021 22:05:42 +0800</pubDate><description><![CDATA[首先要先学习下响应者对象UIResponder，只有继承UIResponder的的类，才能处理事件。


NS_CLASS_AVAILABLE_IOS(2_0) @interface UIApplication : UIResponder

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder &lt;NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEn]]></description><category></category></item><item><title><![CDATA[OC中数组的valueForKeyPath函数应用]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114854094</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114854094</guid><author>MPK_Github</author><pubDate>Mon, 15 Mar 2021 21:51:38 +0800</pubDate><description><![CDATA[- (nullable id)valueForKeyPath:(NSString *)keyPath;


1. 数组求和

如果一个数组是由NSNumber或者数字的字符串组成的，可以直接进行进行求和:




NSArray *array = @[@13, @23, @89, @3, @4, @46, @"2"];
CGFloat sum1 = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];
NSLog(@"%f", sum1); /..]]></description><category></category></item><item><title><![CDATA[iOS性能优化的几个方向]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114853798</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114853798</guid><author>MPK_Github</author><pubDate>Mon, 15 Mar 2021 21:46:03 +0800</pubDate><description><![CDATA[一、界面优化

1、卡顿原理

要了解卡顿原理，需要对帧缓冲区、垂直同步、CPU 和 GPU 几个词进行一下了解，然后综合起来，就可以得到卡顿的答案。

1.1、帧缓冲区

听起来很高大上，其实就是用来存放每一帧画面数据的一个 “仓库”，一个仓库只存放一帧画面的数据，iOS 一直是双缓存，就是有两个仓库，存当前帧数据的叫 “正式仓库”，存下一帧数据的叫 “预备仓库”。

当正式仓库的数据被取走后，两者身份交换，原来的预备仓库转正为正式仓库，原来的正式仓库变成预备仓库。

1.2、垂直同步 (VSync)

]]></description><category></category></item><item><title><![CDATA[锚点和position的关系]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114480864</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114480864</guid><author>MPK_Github</author><pubDate>Sun, 07 Mar 2021 11:34:06 +0800</pubDate><description><![CDATA[1.position

定义：某一个视图的layer的position表示，该视图的layer的锚点在父视图的layer中的位置，默认的数值是视图layer的中点的数值。


从上面的定义的第二句来看，position表示的是在父视图中的位置！


2. anchorPoint

定义：锚点，就像船锚一样，起着固定的作用，有风浪时，船会围着船锚旋转；锚点也是这样的，说白了就是固定视图用的点，每当我们给视图添加一个旋转动画时，就是围绕该点进行旋转的。

3. 记住一点：position 和 锚点 必须是...]]></description><category></category></item><item><title><![CDATA[CALayer的modellayer和presentionlayer的区别]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114480040</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114480040</guid><author>MPK_Github</author><pubDate>Sun, 07 Mar 2021 11:04:35 +0800</pubDate><description><![CDATA[图层树的类型

layer tree 分为 model layer tree(模型图层树) 、presentation layer tree（表示图层树） 、render layer tree（渲染图层树）

图层树的结构

这三种图层树有什么作用呢？说到有啥作用，就不得不提Core Animation 核心动画了。因为这三个图层在核心动画中才能显示出它们的特点和用处。下面是官方文档的说明：


模型图层树中的对象是应用程序与之交互的对象。此树中的对象是存储任何动画的目标值的模型对象。每当更改图层的属性..]]></description><category></category></item><item><title><![CDATA[iOS线程和队列的关系]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114434866</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114434866</guid><author>MPK_Github</author><pubDate>Sat, 06 Mar 2021 10:31:04 +0800</pubDate><description><![CDATA[线程与队列说不清道不明的关系：

线程是代码执行的路径，队列则是用于保存以及管理任务的，线程负责去队列中取任务进行执行。 我的理解：多个队列的任务可以在一条线程上执行，一个队列的任务也可以在多条线程上执行。个人理解，队列可以包含线程，线程也可以包含队列。

dispatch_sync:立马在当前线程执行任务，执行完再往下走，这句话就可以解释很多问题。

dispatch_async:不要求立马在当前线程执行任务，可能会开启新线程，也有可能不会。

一、画图解释下队列跟线程间的关系

1、一个队列对应一...]]></description><category></category></item><item><title><![CDATA[智能家居设备连接路由的技术AirKiss]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114303853</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114303853</guid><author>MPK_Github</author><pubDate>Wed, 03 Mar 2021 11:16:44 +0800</pubDate><description><![CDATA[AirKiss原理分析
一、 AirKiss概述
AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。
AirKiss 技术示意图如下图所示，智能插座与外界没有建立任何一种实质性连接， 可以称之为信息孤岛。通过 Air Kiss 技术，微信客户端 可以将环境中的 Wifi 的ssid 与密码便捷的隔空传递给智能插座，从而使得智能插座能够快速的接入 Wif...]]></description><category></category></item><item><title><![CDATA[iOS链接外部设备的几种方式]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/114303210</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/114303210</guid><author>MPK_Github</author><pubDate>Wed, 03 Mar 2021 11:01:41 +0800</pubDate><description><![CDATA[一般iOS开发者做APP开发大部分时候都是通过Http(s)请求跟后台服务器打交道，做一些信息展示和用户交互。很少涉及到去跟外部硬件设备连接的开发。随着近年来车联网和物联网的兴起，智能家居和智能硬件的逐步火热，越来越多的app被开发出来，用来跟硬件设备进行来连接，获取硬件相关信息展示或者发送指令控制硬件来提供服务。故本文就针对iOS的app如何跟外部设备进行连接通信这个问题跟大家交流一下。本文原创，欢迎转载，转载请注明出处，如有不正确的地方恳请各位看官指正。



可以分为三大类：

第一类是通过网络端口，]]></description><category></category></item><item><title><![CDATA[关于App项目的组件化漫谈(二)]]></title><link>https://blog.youkuaiyun.com/MPK_Github/article/details/100655134</link><guid>https://blog.youkuaiyun.com/MPK_Github/article/details/100655134</guid><author>MPK_Github</author><pubDate>Mon, 09 Sep 2019 11:53:49 +0800</pubDate><description><![CDATA[首先要规划项目的整体架构：

   项目的整体架构并不是所谓的MVC还是MVVM，在我看来，这些只是代码组织的方式，严格意义上来说并不属于项目架构，项目架构需要你站在更高的维度去看事情，规划项目如何去分层；其实一个项目的架构设计与产品的设计仅仅相关，业务层的代码划分为业务层，第三方库属于通用层，我们可以根据业务层对代码的依赖层度来划分，理所当然业务层就应该在最上面，通用层的代码在最下面，如图...]]></description><category></category></item></channel></rss>