<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LinShunIos的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LinShunIos</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LinShunIos]]></copyright><item><title><![CDATA[Swift —— Moya和高阶函数]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/125724204</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/125724204</guid><author>LinShunIos</author><pubDate>Mon, 11 Jul 2022 21:54:54 +0800</pubDate><description><![CDATA[我们日常都会和网络打交道不管是使用 AFN 还是 Alamofire ，虽然这两者都封装了 URLSession ，不用让我们使用官方繁琐的 API。久而久之我们会发现我们的APP中到处都散落着和 AFN 、 Alamofire 相关的代码，不便于统 一的管理，而且很多代码内容是重复的，于是我们就会新建一个中间层 Network layer 来统一 管理我们代码中 AFN 、 Alamofire 的使用。于此同时我们仅仅希望我们的App只和我们的 Network layer 打交道，不用关系底层使用的那个 ]]></description><category></category></item><item><title><![CDATA[Swift ——String 与 Array]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/125710402</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/125710402</guid><author>LinShunIos</author><pubDate>Sun, 10 Jul 2022 23:27:00 +0800</pubDate><description><![CDATA[先创建一个空的字符串,运行后打印地址，看到只有一个有效消息0xe000000000000000。
打开源码查看，看到在String.swift里面有一个初始化空字符串的方法。

那么看到StringGuts.swift方法里面，看到初始化空字符串的方法。

在看到StringObject.swift里面的empty方法。看到这里根据架构不同调用不同的初始化方法。

这里看到arm的结构调用的方法，这里对属性进行赋值。StringObject是一个结构体，这些属性是StringObject的成员变量，那么当对]]></description><category></category></item><item><title><![CDATA[Swift ——泛型与集合]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/125647013</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/125647013</guid><author>LinShunIos</author><pubDate>Fri, 08 Jul 2022 17:07:48 +0800</pubDate><description><![CDATA[下面的 multiNumInt 是个非泛型函数，主要用于计算两个数的乘积
multiNum 函数很实用，但是它只能用于 Int 值。如果我们想计算两个 Double 或者 其他类型的乘积的值，我们需要在写一些函数，比如 multiNumDouble函数:
但是我们发现， 函数体是一样的。唯一的区别是它 们接收值类型不同( Int和double)。这个时候我们想找到一个可以计算任意类型值的函数怎么办?泛型正是能让我们写出这样函数的语法。我们先来看一下泛型的基本写法 ,首先我我们要指定一个占位符 T ,紧挨着写]]></description><category></category></item><item><title><![CDATA[Swift ——协议]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/125627035</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/125627035</guid><author>LinShunIos</author><pubDate>Tue, 05 Jul 2022 22:52:43 +0800</pubDate><description><![CDATA[但是这个时候我们接到一个需求: 要为这两个类创建一个 debug 函数来打印当前类的基本信息。从继承的⻆度来说，我们可能会想到抽取一个公共的基类，当然大家都是动物，人也是动 物。从业务逻辑上来说，这么处理不太合理。可能最直观的办法是对于每一个类都写一个单独的 方法函数。

如果我们对当前代码中的每个类都需要 debug ，那上面这种方法显然是行不通的，于是我们有 了下面的代码
当然看到这里可能大家也会觉得没有问题，如果我们要具体的描述当前类的具体信息，这个时候 我们还需要引入一个公共的基类，同时我们还需要有]]></description><category></category></item><item><title><![CDATA[Swift ——闭包]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/125563929</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/125563929</guid><author>LinShunIos</author><pubDate>Sun, 03 Jul 2022 21:46:23 +0800</pubDate><description><![CDATA[之前在代码的书写过程中，我们已经或多或少的接触过函数，函数本身也有自己的类型，它由形式参数类型，返回类型组成。如果将函数传递给a变量，那么就可以借助a来调用方法,这里addTwoInts代表函数类型。如果出现了同名函数，但是返回值或者参数不一样，那么就需要指明函数类型。否则就会报 ambiguous user of *** 错误，因为这个时候编译器不知道要给a赋值哪一个参数。把函数赋值给a，那么a里面储存的是什么呢？
运行后打印a，这里看懂存储的是函数类型.这里函数类型也是引用类型，当把函数赋值给a的时候，]]></description><category></category></item><item><title><![CDATA[Swift —— 指针]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/122336893</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/122336893</guid><author>LinShunIos</author><pubDate>Sun, 26 Jun 2022 21:13:28 +0800</pubDate><description><![CDATA[Swift —— 指针1.指针2. 指针类型3. 原始指针的使用4. 泛型指针的使用5. 指针读取macho中的属性名称6. 内存绑定7. 内存管理
1.指针
为什么说指针是不安全的呢？主要以下几点：

比如我们在创建一个对象的时候，是需要在堆区分配内存空间的，但是这个内存空间的生命周期是有限的，也就意味着如果我们使用指针指向这块内存空间，如果当前内存空间的生命周期到了（也就是引用计数为0了），那么当前的指针就成了未定义的行为，也就是野指针。
我们创建的内存空间是有边界的，比如创建一个大小为10的数组，这个]]></description><category></category></item><item><title><![CDATA[数据结构与算法 —— 斐波那契函数 & LRU]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/123174746</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/123174746</guid><author>LinShunIos</author><pubDate>Mon, 28 Feb 2022 15:35:51 +0800</pubDate><description><![CDATA[数据结构与算法 ——  斐波那契函数 &amp; LRU1. 斐波那契数列1.1 递归1.2 数组1.3 临时变量1.4 数列1.5 数列优化2.  LRU2.1 双向链表与哈希表2.2 队列
1. 斐波那契数列
斐波那契数列（Fibonacci sequence），又称黄金分割数列，因数学家莱昂纳多·斐波那契（Leonardoda Fibonacci）以兔子繁殖为例子而引入，故又称为“兔子数列”，指的是这样一个数列：0、1、1、2、3、5、8、13、21、34、……也就是除了第一个和第二个数字之外，任何数]]></description><category></category></item><item><title><![CDATA[Swift —— Enum & optional]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/122404674</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/122404674</guid><author>LinShunIos</author><pubDate>Tue, 25 Jan 2022 17:23:21 +0800</pubDate><description><![CDATA[Swift —— Enum &amp; optional1. 枚举的基本用法2. 关联值3. 模式匹配3. 枚举的大小
1. 枚举的基本用法
swift 中通过 enum 关键字来声明一个枚举
enum LGEnum{
    case test_one
    case test_two
    case test_three
}

在 C 或者 OC中默认受整数支持，也就意味着下面的例子中: A， B， C分别默认代表 0， 1，2
typedef NS_ENUM(NSUInteger, LGEnum)]]></description><category></category></item><item><title><![CDATA[Swift —— 属性]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/122303936</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/122303936</guid><author>LinShunIos</author><pubDate>Wed, 05 Jan 2022 16:06:43 +0800</pubDate><description><![CDATA[Swift —— 属性1. 存储属性1.1 let 和 var 的区别代码角度汇编角度SIL角度2. 计算属性
1. 存储属性
存储属性是一个作为特定类和结构体实例一部分的常量或变量。存储属性要么是变量存储属性 (由 var 关键字引入)要么是常量存储属性(由 let 关键字引入)。存储属性这里没有什么特 别要强调的，因为随处可⻅。 比如这里的 age 和 name 就是我们所说的存储属性，这里我们需要加以区分的是 let 和 var 两者的区别:从定义上: let 用来声明常量，常量的值一旦设置好便不能]]></description><category></category></item><item><title><![CDATA[Swift —— 类与结构体的方法]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/122208542</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/122208542</guid><author>LinShunIos</author><pubDate>Thu, 30 Dec 2021 17:50:06 +0800</pubDate><description><![CDATA[Swift —— 类与结构体的方法1. 异变方法
1. 异变方法
Swift 中 class 和 struct 都能定义方法。但是有一点区别的是默认情况 下，值类型属性不能被自身的实例方法修改。

如果想要自身的实例方法可以修改struct的属性，那么就需要在方法前面加上mutating的关键字。

那么mutating做了些什么呢？在结构体里添加一个没有mutating的方法和一个有mutating的方法，这样之后运行生成SIL文件方便进行观察。
struct Point {
    var x = 0.]]></description><category></category></item><item><title><![CDATA[Swift —— 类与结构体]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/122165099</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/122165099</guid><author>LinShunIos</author><pubDate>Tue, 28 Dec 2021 15:02:36 +0800</pubDate><description><![CDATA[Swift —— 类与结构体1. 初识类与结构体1.1 异同点1.2 类（引用类型）1.3 结构体 （值类型）1.4 类和结构体的内存位置1.4.1 结构体的内存位置1.4.2 类的内存位置2. 类的初始化器2.1 指定初始化器&amp;便捷初始化器2.2 可失败初始化器2.3 必要初始化器3. 类的生命周期3.1 SIL文件分析3.2 类的初始化流程
1. 初识类与结构体
1.1 异同点
结构体和类的主要相同点有:

定义存储值的属性
定义方法
定义下标以使用下标语法提供对其值的访问
定义初始化器
使用 ]]></description><category></category></item><item><title><![CDATA[Flutter —— 混合工程自动化]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121919726</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121919726</guid><author>LinShunIos</author><pubDate>Wed, 15 Dec 2021 16:59:31 +0800</pubDate><description><![CDATA[Flutter —— 混合工程自动化1. 前言2. 混合工程
1. 前言
作为一个团队来说，会有很多的工程搭配，团队里会有Flutter工程，Android工程和iOS工程，那么这些工程搭配在一起的时候就会有问题，因为每个开发者都有自己的开发环境，那么这个时候如果去配置所有的环境的话就很麻烦，所以就有了混合工程自动化的需求。
2. 混合工程
先创建一个flutter_module 和 一个 iOS工程。在iOS工程里面创建一个button，响应方法里面展示flutterController， 那么这个时候肯]]></description><category></category></item><item><title><![CDATA[Flutter —— Packages 和 Plugin]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121691569</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121691569</guid><author>LinShunIos</author><pubDate>Fri, 03 Dec 2021 17:25:08 +0800</pubDate><description><![CDATA[Flutter —— packages 和 plugin1. Packages1.1 简介1.2 创建 Packages1.3 发布 Package1.4 Package在项目中应用1.5 Package分数1.6 Part2. Plugin
1. Packages
1.1 简介
Dart package 最低要求是包含一个 pubspec.yaml 文件，package只包含dart部分。此外，一个 package 可以包含依赖关系 (在 pubspec.yaml 文件里声明)、 Dart 库、应用、资源]]></description><category></category></item><item><title><![CDATA[Flutter —— 混合开发]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121538727</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121538727</guid><author>LinShunIos</author><pubDate>Mon, 29 Nov 2021 15:37:13 +0800</pubDate><description><![CDATA[Flutter —— 混合开发1. 混合开发2. 混合开发操作第三方库 imagePicker
1. 混合开发
混合开发分两种情况

Flutter 项目调用原生功能
原生的项目嵌入Flutter（比较重，不建议）

2. 混合开发操作
回到之前的仿微信的我的界面来做一个点击头像通过相册更换图片的功能。

在之前的现实头像的地方添加一个GestureDetector，并且添加onTap方法。

Flutter里面和原生通讯用的是Flutter专门提供的MethodChannel。
这里声明一个_method]]></description><category></category></item><item><title><![CDATA[Flutter —— key 的原理]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121531545</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121531545</guid><author>LinShunIos</author><pubDate>Thu, 25 Nov 2021 15:10:31 +0800</pubDate><description><![CDATA[Flutter —— key 的原理1. Key 的原理2. Key 的 探究
之前的文章中有的类故意没有写Key，那么这个Key有什么作用呢？今天来探究一下。
1. Key 的原理

key 本身是一个抽象类，有一个工厂构造方法创建ValueKey


2. Key 的 探究
其实任何的Widget都是有key的，key是可以为空的。

创建一个KeyDemo放在MaterialApp的home里面
class KeyDemo extends StatefulWidget {
  const KeyDem]]></description><category></category></item><item><title><![CDATA[Flutter —— 渲染原理]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121493749</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121493749</guid><author>LinShunIos</author><pubDate>Thu, 25 Nov 2021 10:36:32 +0800</pubDate><description><![CDATA[Flutter —— 渲染原理1. 渲染原理2.  Render 树3. Element 树4. Element 和 Widget 的关系
1. 渲染原理
在Flutter实战中写道，Flutter 框架的布局、绘制的处理流程是这样的：

根据 Widget 树生成一个 Element 树，Element 树中的节点都继承自 Element 类。
根据 Element 树生成 Render 树（渲染树），渲染树中的节点都继承自RenderObject 类。
根据渲染树生成 Layer 树，然后上屏显示，La]]></description><category></category></item><item><title><![CDATA[Flutter —— 生命周期]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121485958</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121485958</guid><author>LinShunIos</author><pubDate>Tue, 23 Nov 2021 15:01:57 +0800</pubDate><description><![CDATA[Flutter —— 生命周期1. 生命周期
1. 生命周期
一个对象从创建到销毁所经历的过程就是一个生命周期，说白了就是回调方法。在Flutter中已经封装好了，知道widget处于什么样的状态了，然后给你一个对应状态的回调，所以说生命周期其实是一系列的回调方法。
那么生命周期有生命作用呢？

...]]></description><category></category></item><item><title><![CDATA[系统学习iOS动画 —— Stroke和路径动画]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121290126</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121290126</guid><author>LinShunIos</author><pubDate>Mon, 22 Nov 2021 16:09:14 +0800</pubDate><description><![CDATA[这是要完成的动画：

先添加需要的代码，这里需要将storyboard的ViewController换成TableViewController，然后为其Embed in Navigation Controller
import UIKit

func delay(seconds: Double, completion: @escaping ()-&gt; Void) {
  DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: ]]></description><category></category></item><item><title><![CDATA[Flutter —— 搜索框]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121359811</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121359811</guid><author>LinShunIos</author><pubDate>Fri, 19 Nov 2021 10:33:16 +0800</pubDate><description><![CDATA[在聊天界面添加一个搜索框。那么就在ListView里面添加一个cell，那么就需要itemCount里面加1。
  itemCount: _datas.length + 1,

创建一个chat package，然后将chat_page拖进来并且重新创建一个search_cell文件。

将ListView里面的itemBuilder的代码抽取成一个方法，然后在里面判断如果index == 0 则返回 SearchCell。这里后面需要index–，否则index就会从1开始。

接下来写search ce]]></description><category></category></item><item><title><![CDATA[Flutter —— dio]]></title><link>https://blog.youkuaiyun.com/LinShunIos/article/details/121272988</link><guid>https://blog.youkuaiyun.com/LinShunIos/article/details/121272988</guid><author>LinShunIos</author><pubDate>Tue, 16 Nov 2021 16:35:27 +0800</pubDate><description><![CDATA[Flutter —— dio1. 关于import2. pubspec
1. 关于import

import 中 as关键字来给他起了个别名来避免类名、方法名冲突。
导入库，默认是整个库都导入

show：执行需要导入的内容。
hide：需要隐藏的内容。



2. pubspec
pubspec 包含：

name:项目名称，必填字段
description：项目介绍，非必填字段
publish_to ： 指定包发布的位置
version ： 发布的工程版本号
environment SDK ： dar]]></description><category></category></item></channel></rss>