<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[JGL357的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/JGL357</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; JGL357]]></copyright><item><title><![CDATA[排序算法（五）：希尔排序]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103270960</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103270960</guid><author>JGL357</author><pubDate>Wed, 27 Nov 2019 10:38:06 +0800</pubDate><description><![CDATA[希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序，是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是把记录按下标的一定增量分组，对每组使用直接插入排序算法排序；随着增量逐渐减少，每组包含的关键词越来越多，当增量减至1时，整个文件恰被分成一组，算法便终止。

希尔排序总结来说就是把记录按步长 gap 分组，对每组记录采用直接插入排序方法进行排序。随着...]]></description><category></category></item><item><title><![CDATA[排序算法（四）：简单插入排序]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103253366</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103253366</guid><author>JGL357</author><pubDate>Tue, 26 Nov 2019 11:53:15 +0800</pubDate><description><![CDATA[插入排序原理

通过构建有序序列，对于未排序数据，在已排序序列中从后向前扫描，找到相应位置并插入。假设第一个元素排序之后，后面的元素对排号的部分从后向前比较并逐一移动。它包括直接插入排序、二分插入排序（又称折半插入排序）、链表插入排序、希尔排序（又称缩小增量排序），属于稳定排序的一种（稳定排序，通俗的讲，就是两个相等的数不会叫唤位置）。

下面介绍一下直接插入排序

直接插入排序

直接插入排序是...]]></description><category></category></item><item><title><![CDATA[YYCache源码分析]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103239537</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103239537</guid><author>JGL357</author><pubDate>Mon, 25 Nov 2019 16:38:04 +0800</pubDate><description><![CDATA[YYCache是OC用于缓存的第三方框架。



YYCache:同时实现内存缓存和磁盘缓存，且是线程安全的。
	YYDiskCache:实现磁盘缓存，所有的API是线程安卓的，内部也采用了LRU淘汰算法，主要是SQLite和文件存储两种方式。
	YYKVStorage:实现磁盘缓存，不推荐直接使用此类，该类不是线程安全的。
	YYMemoryCache:实现内存缓存，所有的API是线程安全的，也...]]></description><category></category></item><item><title><![CDATA[排序算法（二）：快速排序]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/83340541</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/83340541</guid><author>JGL357</author><pubDate>Mon, 25 Nov 2019 15:08:31 +0800</pubDate><description><![CDATA[快速排序（Quicksort）是对冒泡排序的一种改进。
他的基本思想是：通过一趟排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都比另外一部分的所有数据都要小，然后再按此方法对这两部分数据分别进行快速排序，整个排序过程中可以递归进行，以此达到整个数据变成有序序列。

基本思想：

1．先从数列中取出一个数作为基准数。

2．分区过程，将比这个数大的数全放到它的右边，小于或等于它的数全放到...]]></description><category></category></item><item><title><![CDATA[设计模式在iOS中的应用（一）]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103232797</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103232797</guid><author>JGL357</author><pubDate>Mon, 25 Nov 2019 10:04:42 +0800</pubDate><description><![CDATA[设计模式是有用的抽象化工具，用于解决工程和建筑等领域的设计问题。出于同样的目的，软件开发领域借用了这一概念，设计模式是一个对象或类的设计模板，用于解决特定领域经常发生的问题。本文简单介绍了几种在iOS中常用的设计模式：


	代理模式
	
为其他对象提供一种代理以控制对这个对象的访问。代理模式的思想是使用一个基本跟实体对象行为相同的代理。在iOS中经常使用代理来进行解耦。例如：


使用代理把Vi...]]></description><category></category></item><item><title><![CDATA[编程中的设计原则]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103162702</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103162702</guid><author>JGL357</author><pubDate>Wed, 20 Nov 2019 15:38:02 +0800</pubDate><description><![CDATA[1.单一职责原则

通俗的讲，就是一个类只做一件事。例如：

CALayer：动画和视图的显示。

UIView:只负责事件传递、事件响应。

2.开闭原则

对修改关闭，对扩展开放。要考虑到后续的扩展性，而不是在原有的基础上来回修改。

3.接口隔离原则

使用多个专门的协议，而不是一个庞大臃肿的协议，例如UITableviewDelegate + UITableViewDataSource

...]]></description><category></category></item><item><title><![CDATA[排序算法（三）：简单选择排序]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/103144588</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/103144588</guid><author>JGL357</author><pubDate>Tue, 19 Nov 2019 16:11:24 +0800</pubDate><description><![CDATA[原理：它的工作原理是每一次从待排序的数据元素中选出最小（最大）的一个元素，存放在序列的起始位置，然后再从剩余未排序的元素中继续寻找最小（最大）元素，然后放在已排序序列的末尾。以此类推，直到全部待排序的元素排完。

C语言代码实现选择排序


// 选择排序O(n2):从循环找到最小的元素，与循环的起始位置交换
-(void)selectSort:(NSMutableArray *)array
{
...]]></description><category></category></item><item><title><![CDATA[iOS RunLoop简介]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/96117708</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/96117708</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 15:36:53 +0800</pubDate><description><![CDATA[1.RunLoop和线程的关系？

（1）一个线程对应一个RunLoop;

（2）主线程默认有一个RunLoop;

（3）子线程的RunLoop以懒加载的形式创建；

（4）RunLoop存储在一个全局的可变字典里，线程是key，RunLoop是value;

2.RunLoop的运行模式

RunLoop的运行模式共有5种，RunLoop只会运行在一个模式下，要切换模式，就要暂停当前模式，重...]]></description><category></category></item><item><title><![CDATA[iOS 多线程]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/96325522</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/96325522</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 13:36:20 +0800</pubDate><description><![CDATA[1.进程与线程


进程：


（1）进程是一个具有独立功能的程序关于某次数据集合的一次运行活动，他是操作系统分配资源的基本单位；

（2）进程是指在系统中正在运行的一个应用程序，就是一段程序的执行过程，手机里的APP 就是一个单独的进程；

（3）每个进程之间是相互独立的，每个进程均运行在其专用且受保护的内存空间内，拥有独立运行所需要的全部资源；


线程


（1）程序执行流的最小单位，线程是...]]></description><category></category></item><item><title><![CDATA[iOS组件化简述]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/102853985</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/102853985</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 11:37:16 +0800</pubDate><description><![CDATA[iOS应用架构谈 组件化方案：https://casatwy.com/iOS-Modulization.html

1.组件化有什么好处？

业务分层、解耦，使代码变得可维护；
	有效的拆分、组织日益庞大的工程代码，使工程目录变得可维护；
	便于各业务功能拆分、抽离，实现真正的功能复用；
	业务隔离，跨团队开发代码控制和版本风险控制的实现；
	模块化对代码的封装性、合理性都有一定的要求，提升开发同...]]></description><category></category></item><item><title><![CDATA[iOS基础总结一（KVC、KVO简述）]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/102852872</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/102852872</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 10:51:44 +0800</pubDate><description><![CDATA[1.KVC实现原理

KVC，键值编码，使用字符串直接访问对象的属性；
	底层实现，当一个对象调用setValue方法时，方法内部会做一下操作：
（1）检查是否存在相应key的set方法，如果存在，就调用set方法；

（2）如果set方法不存在，就会查找与key相同名称且带下划线的成员属性，如果有，则直接给成员属性赋值；

（3）如果没有找到_key，就会查找相同名称的属性key。如果有，就直...]]></description><category></category></item><item><title><![CDATA[设计模式（一）：单例模式]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/83058319</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/83058319</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 10:03:21 +0800</pubDate><description><![CDATA[单例模式，是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例！

一.单例模式简介

1.单例模式的作用
可以保证在程序运行过程中，一个类只有一个实例，而且该实例易于供外界访问，从而方便的控制了实例个数，并节约系统资源。
2.单例模式的使用场景
在整个应用程序中，共享一份资源（这份资源只需要创建初始化一次）...]]></description><category></category></item><item><title><![CDATA[iOS基础总结一（UIKit、Foundation）]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/102843171</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/102843171</guid><author>JGL357</author><pubDate>Fri, 01 Nov 2019 10:01:09 +0800</pubDate><description><![CDATA[1.如何实现一个线程安全的NSMutableArray?

NSMutableArray是线程不安全的，当有多个线程同时对数组进行操作的时候，可能会导致崩溃或者数据错误。

实现方案：

线程锁：使用线程锁对数组的读写操作进行加锁；
	派发队列：使用“串行同步队列”（serial synchronization queue），将读取操作及写入操作都安排在同一个队列里，即可保证数据同步。而通过并发队...]]></description><category></category></item><item><title><![CDATA[数据结构]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/102842038</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/102842038</guid><author>JGL357</author><pubDate>Thu, 31 Oct 2019 18:20:39 +0800</pubDate><description><![CDATA[1.数据结构的存储一般常用的有几种？各有什么特点？

数据结构的存储一般常用的有两种：顺序存储结构和链式存储结构。

顺序存储结构：比如数组，1-2-3-4-5-6-7-8-9-10，存储是按顺序的，再比如栈和队列等。
	链式存储结构：链式存储结构是根据地址进行存储的，每一个存储数据后面跟着一个地址，并且存储形式不再是顺序的。
2.集合结构 线性结构 树形结构 图形结构

集合结构：一个集合，就是...]]></description><category></category></item><item><title><![CDATA[iOS APP耗电的来源与优化]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/95060903</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/95060903</guid><author>JGL357</author><pubDate>Mon, 08 Jul 2019 15:19:03 +0800</pubDate><description><![CDATA[耗电的主要来源：

CPU处理，Processing
	网络，Networking
	定位，Location
	图像，Graphics
耗电的优化：

尽可能降低CPU、GPU功耗
	尽量减少定时器的使用
	优化I/O操作
尽量不要频繁写入小数据，最好批量一次性写入
	读写大量重要数据时，考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API ,用dispatch_io系统会...]]></description><category></category></item><item><title><![CDATA[iOS APP卡顿优化]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/95059410</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/95059410</guid><author>JGL357</author><pubDate>Mon, 08 Jul 2019 14:53:09 +0800</pubDate><description><![CDATA[卡顿解决的主要思路：

尽可能减少CPU、GPU资源消耗
	尽量使用轻量级的对象，比如用不到事件处理的地方，可以考虑用CALayer取代UIView.
	不要频繁的调用UIView的相关属性，比如frame、bounds、transform等属性，尽量减少不必要的修改。
	尽量提前计算好布局，在有需要的时候一次性调整对应的属性，不要多次修改属性。
	Autolayout会比直接设置frame消耗更...]]></description><category></category></item><item><title><![CDATA[http + restful简介]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/79073143</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/79073143</guid><author>JGL357</author><pubDate>Thu, 13 Jun 2019 17:34:29 +0800</pubDate><description><![CDATA[1原理

1.1 简介

Http协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,是用于从万维网（WWW:WorldWide Web ）服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据（HTML文件, 图片文件, 查询结果等）。http的工作原理HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过U...]]></description><category></category></item><item><title><![CDATA[Block 的本质是什么]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/82933066</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/82933066</guid><author>JGL357</author><pubDate>Mon, 22 Oct 2018 13:27:57 +0800</pubDate><description><![CDATA[block是一个指针结构体，在终端下通过clang -rewrite-objc 指令看看C++代码。


#import &amp;lt;Foundation/Foundation.h&amp;gt;
int main(int arc,const char *argv[]){
    void (^myblock)() = ^(){
        NSLog(@&quot;hello block&quot;);
    };
  ...]]></description><category></category></item><item><title><![CDATA[设计模式（二）：代理模式（委托模式）]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/83093659</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/83093659</guid><author>JGL357</author><pubDate>Tue, 16 Oct 2018 17:45:33 +0800</pubDate><description><![CDATA[代理模式

组成：
抽象角色：通过接口或者抽象类声明真实角色实现的业务方法
代理角色：实现抽象角色，是真实角色的代理，通过真实角色的业务逻辑方法来实现抽象方法，并可以附加自己的操作。
真实角色：实现抽象角色，定义真实角色所需要实现的业务逻辑，供代理角色调用

代理的基本作用

代理是一种通用的设计模式，在iOS中对代理设计模式支持的很好，有特定的语法来实现代理模式，OC语言可以通过@protoco...]]></description><category></category></item><item><title><![CDATA[排序算法（一）：冒泡排序]]></title><link>https://blog.youkuaiyun.com/JGL357/article/details/83056606</link><guid>https://blog.youkuaiyun.com/JGL357/article/details/83056606</guid><author>JGL357</author><pubDate>Mon, 15 Oct 2018 11:56:47 +0800</pubDate><description><![CDATA[冒泡排序（Bubble Sort）,是一种计算机科学领域的较简单的排序算法。
它重复的走访过要排列的数列，一次比较两个元素，如果他们的顺序错误就把他们交换过来，走访数列的工作是重复的进行直到没有有再需要交换，也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列顶端，所以命名为冒泡排序。

算法原理：
冒泡排序算法的运作如下：（从后往前）
1.比较相邻的元素。如...]]></description><category></category></item></channel></rss>