<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>文章 on 燕航的手记</title><link>https://hugo-blog-bsg.pages.dev/posts/</link><description>Recent content in 文章 on 燕航的手记</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>© 2026 燕航</copyright><lastBuildDate>Mon, 27 Mar 2023 15:35:21 +0800</lastBuildDate><atom:link href="https://hugo-blog-bsg.pages.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>离线包实现app内H5的秒开</title><link>https://hugo-blog-bsg.pages.dev/%E7%A6%BB%E7%BA%BF%E5%8C%85%E5%AE%9E%E7%8E%B0app%E5%86%85h5%E7%9A%84%E7%A7%92%E5%BC%80/</link><pubDate>Mon, 27 Mar 2023 15:35:21 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E7%A6%BB%E7%BA%BF%E5%8C%85%E5%AE%9E%E7%8E%B0app%E5%86%85h5%E7%9A%84%E7%A7%92%E5%BC%80/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;市面上业务复杂 App中近半数业务页面使用H5 页面承载，H5的优势很明显，跨平台、迭代快、开发体验好，H5的劣势同样明显，加载慢，用户体验差，为了提高页面加载速度和成功率，我们在app H5 部分业务加载 采用了离线包方式，如果有业务功能有变更，就通过我们的无线发布系统，将新的业务离线包更新到App 中，从而做到随时发布，动态更新，页面秒开，无须app 改动。&lt;/p&gt;</description></item><item><title>敏捷开发</title><link>https://hugo-blog-bsg.pages.dev/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/</link><pubDate>Fri, 10 Jun 2022 12:03:44 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;今年公司引进敏捷开发工具套件 jira ，bitbuket，conference ，下面 了解了下敏捷开发的使用。&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://hugo-blog-bsg.pages.dev/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91/featured-image.jpg"/></item><item><title>2022年度读的书籍</title><link>https://hugo-blog-bsg.pages.dev/2022%E5%B9%B4%E5%BA%A6%E8%AF%BB%E7%9A%84%E4%B9%A6%E7%B1%8D/</link><pubDate>Sun, 29 May 2022 19:28:58 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/2022%E5%B9%B4%E5%BA%A6%E8%AF%BB%E7%9A%84%E4%B9%A6%E7%B1%8D/</guid><description>&lt;h1 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;记录下2022年度已读的书籍。&lt;/p&gt;&#10;&#10;&lt;h1 class="relative group"&gt;书单&#10; &lt;div id="书单" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b9%a6%e5%8d%95" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;书名&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: center"&gt;作者&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: center"&gt;简介（个人见 解  ）&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/35546622/" target="_blank" rel="noreferrer"&gt;置身事内&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;兰小欢&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;中国经济模型&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/35585201/" target="_blank" rel="noreferrer"&gt;微尘&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;陈年喜&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;最近几年小人物的生活&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/26872634/" target="_blank" rel="noreferrer"&gt;思辨与立场 : 生活中无处不在的批判性思维工具&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;理查德·保罗 琳达·埃尔德&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;看待事情的真相&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/1013208/" target="_blank" rel="noreferrer"&gt;如何阅读一本书&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;[美] 莫提默·J. 艾德勒 / 查尔斯·范多伦&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;一本书的要点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/1033778/" target="_blank" rel="noreferrer"&gt;富爸爸，穷爸爸&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;（美）罗伯特・T・清崎 / 莎伦・L・莱希特&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;思维决定赚钱的方法&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/1786387/" target="_blank" rel="noreferrer"&gt;影响力&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;[美] 罗伯特·西奥迪尼&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;说服别人的方式&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/35557542/" target="_blank" rel="noreferrer"&gt;穷查理宝典 : 查理·芒格智慧箴言录&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;[美]彼得·考夫曼 编]&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;人生笺言（更好的生活）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/34839883/" target="_blank" rel="noreferrer"&gt;程序员的三门课：技术精进、架构修炼、管理探秘&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;&lt;a href="https://book.douban.com/search/%E4%BA%8E%E5%90%9B%E6%B3%BD" target="_blank" rel="noreferrer"&gt;于君泽&lt;/a&gt; / &lt;a href="https://book.douban.com/search/%E6%9D%8E%E4%BC%9F%E5%B1%B1" target="_blank" rel="noreferrer"&gt;李伟山&lt;/a&gt; / &lt;a href="https://book.douban.com/search/%E5%BC%A0%E6%B4%AA%E4%BA%AE" target="_blank" rel="noreferrer"&gt;张洪亮&lt;/a&gt; / &lt;a href="https://book.douban.com/search/%E5%BD%AD%E9%A6%96%E9%95%B7" target="_blank" rel="noreferrer"&gt;彭首長&lt;/a&gt; / &lt;a href="https://book.douban.com/search/%E5%88%98%E6%9C%8B" target="_blank" rel="noreferrer"&gt;刘朋&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;技术架构以及管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/35635639/" target="_blank" rel="noreferrer"&gt;法治的细节&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;&lt;a href="https://book.douban.com/search/%E7%BD%97%E7%BF%94" target="_blank" rel="noreferrer"&gt;罗翔&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;思辨下的法制&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/2130190/" target="_blank" rel="noreferrer"&gt;Java 编程思想&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;&lt;a href="https://book.douban.com/author/211604/" target="_blank" rel="noreferrer"&gt;[美] Bruce Eckel&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;java 学习&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/35593780/" target="_blank" rel="noreferrer"&gt;工作消费主义新穷人&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;[英]齐格蒙特·鲍曼](&lt;a href="https://book.douban.com/subject/35593780/" target="_blank" rel="noreferrer"&gt;https://book.douban.com/subject/35593780/&lt;/a&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;现在社会的认知&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/2230248/" target="_blank" rel="noreferrer"&gt;人月神话&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;&lt;a href="https://book.douban.com/author/427008/" target="_blank" rel="noreferrer"&gt;弗雷德里克·布鲁克斯&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;IT项目管理&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;a href="https://book.douban.com/subject/1174721/" target="_blank" rel="noreferrer"&gt;丧钟为谁而鸣&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;&lt;a href="https://book.douban.com/author/4525432/" target="_blank" rel="noreferrer"&gt;海明威&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: center"&gt;战争的破坏&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10;&lt;h1 class="relative group"&gt;歌&#10; &lt;div id="歌" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%ad%8c" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&#10;&#10;&#10; &#10; &#10;&#10;&lt;p class="music-link"&gt;&lt;a href="https://music.163.com/#/song?id=1868553" target="_blank" rel="noopener noreferrer"&gt;♫ 在网易云音乐收听 &lt;span aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://hugo-blog-bsg.pages.dev/2022%E5%B9%B4%E5%BA%A6%E8%AF%BB%E7%9A%84%E4%B9%A6%E7%B1%8D/featured-image.jpg"/></item><item><title>源码分析runloop</title><link>https://hugo-blog-bsg.pages.dev/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90runloop/</link><pubDate>Tue, 22 Mar 2022 11:54:51 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90runloop/</guid><description>&lt;h2 class="relative group"&gt;runloop 源码&#10; &lt;div id="runloop-源码" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#runloop-%e6%ba%90%e7%a0%81" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;nsrunloop 未开源，cfrunloopref 已开源。共有五个类&lt;/p&gt;&#10;&lt;p&gt;CFRunLoopRef （runloop对象）&lt;/p&gt;&#10;&lt;p&gt;CFRunLoopModeRef （runloop 模式）&lt;/p&gt;</description></item><item><title>runloop理论剖析</title><link>https://hugo-blog-bsg.pages.dev/runloop%E7%90%86%E8%AE%BA%E5%89%96%E6%9E%90/</link><pubDate>Fri, 25 Feb 2022 15:56:33 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/runloop%E7%90%86%E8%AE%BA%E5%89%96%E6%9E%90/</guid><description>&lt;figure&gt;&lt;img src="https://hugo-blog-bsg.pages.dev/images/rzrinoNyn4.jpg" alt="tea (`image`)" loading="lazy" decoding="async"&gt;&lt;figcaption&gt;tea (&lt;code&gt;image&lt;/code&gt;)&lt;/figcaption&gt;&lt;/figure&gt;&#10;&#10;&#10;&lt;h1 class="relative group"&gt;什么是runloop&#10; &lt;div id="什么是runloop" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%afrunloop" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;程序在启动的时候，一般按照代码顺序执行 ，执行完就结束。为了 维持一时刻运行等待用户输入事件的机制，程序不退出，出现了evenloop（消息/事件&amp;ndash;观察- 唤醒-等待-），比如 Node.js 的事件处理，比如 Windows 程序的消息循环，再比如 OSX/iOS 里的 RunLoop。&lt;/p&gt;</description></item><item><title>ios和h5双向数据交互</title><link>https://hugo-blog-bsg.pages.dev/ios%E5%92%8Ch5%E9%A1%B5%E9%9D%A2%E5%8F%8C%E5%90%91%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92/</link><pubDate>Thu, 24 Feb 2022 10:07:31 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/ios%E5%92%8Ch5%E9%A1%B5%E9%9D%A2%E5%8F%8C%E5%90%91%E6%95%B0%E6%8D%AE%E4%BA%A4%E4%BA%92/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;ios 与h5 交互是混合开发的基石，交互方式分为三种，webview 交互，jsbrige交互，JavaScriptCore交互。&lt;/p&gt;</description></item><item><title>大型pc平台前端实现方案</title><link>https://hugo-blog-bsg.pages.dev/%E5%A4%A7%E5%9E%8Bpc%E5%B9%B3%E5%8F%B0%E5%89%8D%E7%AB%AF%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88/</link><pubDate>Tue, 22 Feb 2022 14:37:27 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E5%A4%A7%E5%9E%8Bpc%E5%B9%B3%E5%8F%B0%E5%89%8D%E7%AB%AF%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;对公司最近新的千万级项目使用到的前端实现方案进行大致的总结，包括 react ，antd， antpro，less。&lt;/p&gt;</description></item><item><title>vue的vue2和vue3</title><link>https://hugo-blog-bsg.pages.dev/vue%E7%9A%84vue2%E5%92%8Cvue3/</link><pubDate>Thu, 06 Jan 2022 21:40:30 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/vue%E7%9A%84vue2%E5%92%8Cvue3/</guid><description>&lt;h2 class="relative group"&gt;选项API和组合API&#10; &lt;div id="选项api和组合api" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%80%89%e9%a1%b9api%e5%92%8c%e7%bb%84%e5%90%88api" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;什么是选项API写法：&lt;code&gt;Options ApI&lt;/code&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;咱们在vue2.x项目中使用的就是 &lt;code&gt;选项API&lt;/code&gt; 写法&lt;/p&gt;</description></item><item><title>ios团队代码规范</title><link>https://hugo-blog-bsg.pages.dev/ios%E5%9B%A2%E9%98%9F%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/</link><pubDate>Fri, 26 Nov 2021 12:01:20 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/ios%E5%9B%A2%E9%98%9F%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/</guid><description>&lt;h2 class="relative group"&gt;概述&#10; &lt;div id="概述" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%a6%82%e8%bf%b0" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Objective-C语言主要用于iOS和Mac开发，本文结合苹果规范和Google规范，再加上自己的个人经验总结出来的一系列编码规范。 苹果开发规范 &lt;a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html" target="_blank" rel="noreferrer"&gt;apple object-c guide&lt;/a&gt; Google Objective-C规范&lt;a href="https://zh-google-styleguide.readthedocs.io/en/latest/google-objc-styleguide/" target="_blank" rel="noreferrer"&gt;google-objc-styleguide&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>阿里云hugo博客搭建指南</title><link>https://hugo-blog-bsg.pages.dev/%E9%98%BF%E9%87%8C%E4%BA%91hugo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/</link><pubDate>Mon, 25 Oct 2021 17:13:20 +0800</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E9%98%BF%E9%87%8C%E4%BA%91hugo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/</guid><description>&lt;figure&gt;&#10; &lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="auto"&#10; alt=""&#10; width="1972"&#10; height="1315"&#10; src="https://hugo-blog-bsg.pages.dev/images/lighthouse_hu_e14d28bbea5a7f33.jpg"&#10; srcset="https://hugo-blog-bsg.pages.dev/images/lighthouse_hu_e14d28bbea5a7f33.jpg 800w,/images/lighthouse_hu_ad79671090ee72d8.jpg 1280w"&#10; sizes="(min-width: 768px) 50vw, 65vw"&#10; data-zoom-src="https://hugo-blog-bsg.pages.dev/images/lighthouse.jpg"&#10; /&gt;&#10; &#10; &#10; &lt;/figure&gt;&#10;&#10;&lt;h2 class="relative group"&gt;引言&#10; &lt;div id="引言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%bc%95%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;2016年至今个人站一直放在github上，源文档md文件一个仓库， 部署文件夹放另外一个仓库，托管到github。阿里云活动申请了3年的ECS，还好不到二百大洋，能接受，同时申请了一个域名，一个htpps 证书，以后还想干些其他的，就用了docker容器来进行构建，使用了nginx作为后端服务器程序，使用了github ci/cd进行集成和部署。&lt;/p&gt;</description></item><item><title>cocoapods离线库以及内网库</title><link>https://hugo-blog-bsg.pages.dev/cocoapods%E7%A6%BB%E7%BA%BF%E5%BA%93%E4%BB%A5%E5%8F%8A%E5%86%85%E7%BD%91%E5%BA%93/</link><pubDate>Thu, 17 Sep 2020 22:36:24 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/cocoapods%E7%A6%BB%E7%BA%BF%E5%BA%93%E4%BB%A5%E5%8F%8A%E5%86%85%E7%BD%91%E5%BA%93/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;解决无网络状态下无 pod 库以及库不一致问题。省去下载，安全问题。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;pod 库的制作&#10; &lt;div id="pod-库的制作" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pod-%e5%ba%93%e7%9a%84%e5%88%b6%e4%bd%9c" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;暴露 文件（引用使用）&lt;/li&gt;&#10;&lt;li&gt;隐藏 文件 （.m 文件，静态库等）&lt;/li&gt;&#10;&lt;li&gt;资源 文件&lt;/li&gt;&#10;&lt;li&gt;podspec 文件&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h3 class="relative group"&gt;podspec&#10; &lt;div id="podspec" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#podspec" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;为方便 pod install 运行时，能引用到相应的文件的一个配置文件，方便项目引用。常用的配置项是暴露的.h 文件。外界库文件的引用，系统库的引用（framework，.a ）。&lt;/p&gt;</description></item><item><title>iOS的Crash情况以及防护</title><link>https://hugo-blog-bsg.pages.dev/ios%E7%9A%84crash%E6%83%85%E5%86%B5%E4%BB%A5%E5%8F%8A%E9%98%B2%E6%8A%A4/</link><pubDate>Wed, 19 Feb 2020 22:00:34 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/ios%E7%9A%84crash%E6%83%85%E5%86%B5%E4%BB%A5%E5%8F%8A%E9%98%B2%E6%8A%A4/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Crash 防护 分为两个方面 开始阶段拒绝出现，要不就是预测所有的情况进行处理。&lt;/p&gt;</description></item><item><title>ios启动到首页加载</title><link>https://hugo-blog-bsg.pages.dev/ios%E5%90%AF%E5%8A%A8%E5%88%B0%E9%A6%96%E9%A1%B5%E5%8A%A0%E8%BD%BD/</link><pubDate>Wed, 25 Dec 2019 23:20:34 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/ios%E5%90%AF%E5%8A%A8%E5%88%B0%E9%A6%96%E9%A1%B5%E5%8A%A0%E8%BD%BD/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;App 启动过程包括点击 App 图标到 app 出现首页渲染完成。这个启动过程是由三部分组成。第一部分 main 执行前（T1），第二 main 函数执行后到首页加载（T2），首页加载到渲染完成（T3）。&lt;/p&gt;</description></item><item><title>block 中 strongself剖析</title><link>https://hugo-blog-bsg.pages.dev/block-%E4%B8%AD-strongself%E5%89%96%E6%9E%90/</link><pubDate>Sun, 19 Aug 2018 21:28:30 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/block-%E4%B8%AD-strongself%E5%89%96%E6%9E%90/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;解决内存提前释放，与weakself 相对。在使用的时候依然还存在。&lt;/p&gt;</description></item><item><title>高性能多线程gcd</title><link>https://hugo-blog-bsg.pages.dev/%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8Bgcd/</link><pubDate>Thu, 19 Jul 2018 23:28:30 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E9%AB%98%E6%80%A7%E8%83%BD%E5%A4%9A%E7%BA%BF%E7%A8%8Bgcd/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;gcd 全名字是全局任务分发，线程管理的一种方式。GCD 更加趋近于底层性能较高。与gcd 相关的概念有，队列，队列组，同步异步函数。&lt;/p&gt;</description></item><item><title>runtime中的对象</title><link>https://hugo-blog-bsg.pages.dev/object-c-runtime%E4%B8%AD%E5%AF%B9%E8%B1%A1/</link><pubDate>Mon, 19 Mar 2018 22:00:34 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/object-c-runtime%E4%B8%AD%E5%AF%B9%E8%B1%A1/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;runtime 是一个运行时系统，是iOS object-c的核心，使 C语言 具有了面向对象的功能。runtime 库实现了面向对象的继承链。利用 c 的结构体和指针。并且有对象模型的定义。&lt;/p&gt;</description></item><item><title>_Attribute_</title><link>https://hugo-blog-bsg.pages.dev/gnu-c%E7%89%B9%E8%89%B2__attribute__/</link><pubDate>Sun, 17 Sep 2017 22:36:24 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/gnu-c%E7%89%B9%E8%89%B2__attribute__/</guid><description>&lt;h2 class="relative group"&gt;概述&#10; &lt;div id="概述" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%a6%82%e8%bf%b0" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;GNU C 的一大特色就是__attribute__ 机制。&lt;strong&gt;attribute&lt;/strong&gt; 可以设置函数属性（Function Attribute ）、变量属性（Variable Attribute ）和类型属性（Type Attribute ）。&lt;/p&gt;</description></item><item><title>从文件结构看sdwebimage</title><link>https://hugo-blog-bsg.pages.dev/%E4%BB%8E%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E7%9C%8Bsdwebimage/</link><pubDate>Sat, 12 Aug 2017 23:28:00 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E4%BB%8E%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E7%9C%8Bsdwebimage/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一个异步下载图片并且支持缓存的 UIImageView 分类&lt;/li&gt;&#10;&lt;li&gt;sdwebimage 使用分类协议扩展通知实现了图片下载（异步），缓存（自动），解码（ WebP 格式）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;code 文件结构&#10; &lt;div id="code-文件结构" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#code-%e6%96%87%e4%bb%b6%e7%bb%93%e6%9e%84" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;figure&gt;&lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="图片"&#10; src="https://yanhangblogimage.oss-cn-beijing.aliyuncs.com/textimage/WechatIMG40.png"&#10; &gt;&lt;/figure&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;manager（管理下载和缓存，供给上层 webCache Categories 使用）&lt;/li&gt;&#10;&lt;li&gt;downloader（下载模块）&lt;/li&gt;&#10;&lt;li&gt;cache（缓存模块包括 SDImageCache 与 SDDiskCache）&lt;/li&gt;&#10;&lt;li&gt;Decoder（解码模块）&lt;/li&gt;&#10;&lt;li&gt;utils（错误，平台，下载指示器，声明，宏定义，通用协议，）&lt;/li&gt;&#10;&lt;li&gt;categories（数据分类如 NSdata 工具分类）&lt;/li&gt;&#10;&lt;li&gt;webCache Categories（UIkit 相关的分类）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;模块之 webCache Categories&#10; &lt;div id="模块之-webcache-categories" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%a8%a1%e5%9d%97%e4%b9%8b-webcache-categories" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;UIkit 中的 uiview 作为 UIImageView 和 UIBtton 父类为其他子类提供便利方法来实现共用。uiview 的便利方法使用分类实现。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//所有 View Category 的 setImageUrl；&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;sd_internalSetImageWithURL:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;NSURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;placeholderImage:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;UIImage&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;placeholder&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;options:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SDWebImageOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;context:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;SDWebImageContext&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;context&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;setImageBlock:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;SDSetImageBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;setImageBlock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;progress:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;SDImageLoaderProgressBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;progressBlock&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;completed:&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nullable&lt;/span&gt; &lt;span class="n"&gt;SDInternalCompletionBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;completedBlock&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&#10;&lt;h2 class="relative group"&gt;主要模块&#10; &lt;div id="主要模块" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%bb%e8%a6%81%e6%a8%a1%e5%9d%97" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SDWebImageCompat 做机型适配的。&lt;/li&gt;&#10;&lt;li&gt;SDWebImageDownloader 异步下载器专用和优化图像加载。&lt;/li&gt;&#10;&lt;li&gt;SDWebImagePrefetcher 图片的预加载。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;待续&#10; &lt;div id="待续" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%be%85%e7%bb%ad" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;</description></item><item><title>SDWebImageManager</title><link>https://hugo-blog-bsg.pages.dev/sdwebimge%E4%B9%8B-sdwebimagemanager/</link><pubDate>Fri, 19 May 2017 21:00:34 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/sdwebimge%E4%B9%8B-sdwebimagemanager/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;SDWebImageManager 是一个单利，管理整个 SDWebImge 这个库的下载，缓存，回调展示。&lt;/p&gt;&#10;&lt;blockquote&gt;&lt;p&gt;属性功能有 imageCache（查找工具），imageLoader（下载工具），runningOperations（用以放 DWebImageCombinedOperation）。&lt;code&gt;failedURLsLock&lt;/code&gt;，&lt;code&gt;runningOperationsLock&lt;/code&gt;是&lt;code&gt;dispatch_semaphore_t&lt;/code&gt;锁。信号量为 1，即只能用一个线程访问如果多个线程访问就会阻塞问题。保证写入数据时候只能一个线程操作。&lt;/p&gt;</description></item><item><title>SDWebImageDefine源码学习</title><link>https://hugo-blog-bsg.pages.dev/sdwebimagedefine%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/</link><pubDate>Wed, 12 Apr 2017 21:28:15 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/sdwebimagedefine%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;block ，枚举字符串，内敛函数学习&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;block 声明&#10; &lt;div id="block-声明" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#block-%e5%a3%b0%e6%98%8e" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="nf"&gt;void&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;SDWebImageNoParamsBlock&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&#10;&lt;h2 class="relative group"&gt;枚举字符串&#10; &lt;div id="枚举字符串" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%9e%9a%e4%b8%be%e5%ad%97%e7%ac%a6%e4%b8%b2" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;NSString&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SDWebImageContextOption&lt;/span&gt; &lt;span class="n"&gt;NS_EXTENSIBLE_STRING_ENUM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//SDWebImageContextOption类型&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//NS_EXTENSIBLE_STRING_ENUM 可用于swift 枚举字符串&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;SDWebImageContextOption&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;&lt;a href="https://blog.csdn.net/weixin_34358092/article/details/91424409" target="_blank" rel="noreferrer"&gt;参看 csdn 解析&lt;/a&gt;&lt;/p&gt;</description></item><item><title>kvo使用和机理</title><link>https://hugo-blog-bsg.pages.dev/kvo%E4%BD%BF%E7%94%A8%E5%92%8C%E6%9C%BA%E7%90%86/</link><pubDate>Sun, 19 Mar 2017 19:28:30 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/kvo%E4%BD%BF%E7%94%A8%E5%92%8C%E6%9C%BA%E7%90%86/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;kvo 全称是 key value observe。键值观察的意思，观察某个对象做出响应，由 NSKeyValueObserving 协议提供支持，NSObject 类继承了该协议，所以 NSObject 的子类都可使用该方法。&lt;/p&gt;</description></item><item><title>SDWebImageIndicator</title><link>https://hugo-blog-bsg.pages.dev/sdwebimageindicator/</link><pubDate>Thu, 19 Jan 2017 21:18:01 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/sdwebimageindicator/</guid><description>&lt;p&gt;SDWebImageIndicator&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;我是前言&#10; &lt;div id="我是前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%88%91%e6%98%af%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SDWebImageIndicator 在图像加载期间定制指示器的协议。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;判断平台&#10; &lt;div id="判断平台" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%88%a4%e6%96%ad%e5%b9%b3%e5%8f%b0" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#if SD_UIKIT || SD_MAC&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//code...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;如果是 UIkit 平台以及 mac 会进行 code 的编译。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;协议声明&#10; &lt;div id="协议声明" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8d%8f%e8%ae%ae%e5%a3%b0%e6%98%8e" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@protocol&lt;/span&gt; &lt;span class="nc"&gt;SDWebImageIndicator&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NSObject&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@required&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; The view associate to the indicator.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; @return The indicator view&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonnull&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UIView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indicatorView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; Start the animating for indicator.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;startAnimatingIndicator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; Stop the animating for indicator.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;stopAnimatingIndicator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@optional&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; Update the loading progress (0-1.0) for indicator. Optional&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; @param progress The progress, value between 0 and 1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nl"&gt;updateIndicatorProgress&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;这个协议也遵守了&lt;NSObject&gt;协议。&lt;/li&gt;&#10;&lt;li&gt;这个协议声明一个属性，但是这个属性在这个地方也只是方法声明。这个地方是生成了 get 方法。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;协议的实现&#10; &lt;div id="协议的实现" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8d%8f%e8%ae%ae%e7%9a%84%e5%ae%9e%e7%8e%b0" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;在 SDWebImageIndicator.h 文件里有一个类的声明，这个类遵循了 SDWebImageIndicator 协议。同时出现了和协议的属性名字是完全一样的属性名称 indicatorView。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;SDWebImageActivityIndicator&lt;/span&gt; : &lt;span class="nc"&gt;NSObject&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SDWebImageIndicator&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#if SD_UIKIT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonnull&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UIActivityIndicatorView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indicatorView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#else&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonnull&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSProgressIndicator&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indicatorView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;上诉代码就是一个巧妙之处，一个协议里面的属性不是真正的属性，它只是方法声明，另一个巧妙之处是起到提醒遵守者你要有一个 indicatorView 属性哦。更牛的其实在后边。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-objc" data-lang="objc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//.m 文件&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@interface&lt;/span&gt; &lt;span class="nc"&gt;SDWebImageActivityIndicator&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#if SD_UIKIT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;readwrite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonnull&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UIActivityIndicatorView&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indicatorView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#else&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@property&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nonatomic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;readwrite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nonnull&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NSProgressIndicator&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indicatorView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;这个里面可以发现作者有扩展一个 indicatorView 属性，这是又是为什么呢，为了实现 indicatorView 属性的方法。同时 为了 SDWebImageActivityIndicator 初始化的时候使用到这个属性的 get 方法。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;协议总结&#10; &lt;div id="协议总结" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8d%8f%e8%ae%ae%e6%80%bb%e7%bb%93" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;协议里使用属性方法的声明。&lt;/p&gt;</description></item><item><title>https和http</title><link>https://hugo-blog-bsg.pages.dev/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AEhttps%E5%92%8Chttp/</link><pubDate>Thu, 19 Jan 2017 19:28:30 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AEhttps%E5%92%8Chttp/</guid><description>&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;http 与 https 都是网络传输协议，其中 http 是超文本传输协议，https 是基于 SSL/TLS 协议的超文本传输协议。SSL/TLS 是安全认证协议。http 加上 ssl/TLS 作用是&lt;strong&gt;防止钓鱼和加密&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;https&#10; &lt;div id="https" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#https" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;防止钓鱼，保证服务端不被冒充，使用 https 时候，客户端从服务端下载证书，然后对证书进行 CA 认证，可以确认服务器身份。&lt;/li&gt;&#10;&lt;li&gt;加密，身份确定后，证书中有公钥，服务器有私钥。公钥私钥完成加密，保证了数据的安全。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;https 和 http 的区别&#10; &lt;div id="https-和-http-的区别" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#https-%e5%92%8c-http-%e7%9a%84%e5%8c%ba%e5%88%ab" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;认证的区别（https 需要证书）&lt;/p&gt;</description></item><item><title>KVO实现MVVM</title><link>https://hugo-blog-bsg.pages.dev/mvvm/</link><pubDate>Sat, 19 Nov 2016 19:38:31 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/mvvm/</guid><description>&lt;h2 class="relative group"&gt;为什么要用 MVVM 代替 MVC？&#10; &lt;div id="为什么要用-mvvm-代替-mvc" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8-mvvm-%e4%bb%a3%e6%9b%bf-mvc" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10;&lt;figure&gt;&lt;img src="https://hugo-blog-bsg.pages.dev/images/lighthouse.jpg" alt="Lighthouse (`image`)" loading="lazy" decoding="async"&gt;&lt;figcaption&gt;Lighthouse (&lt;code&gt;image&lt;/code&gt;)&lt;/figcaption&gt;&lt;/figure&gt;&#10;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Apple 倡导开发者们使用 MVC 模式开发 App 程序，但很多人都没有严格按照 MVC 的模式去开发，只是让程序的架构看上去像 MVC，而实际上是 MC 或 VC，很多入门开发者都有一个通病，就是把所有的逻辑，界面生成都写进 ViewController 中，这样 ViewController 就变成了一个 Massive View Controller（重量级视图控制器）。重量级视图控制器会让整个 ViewController 变得非常复杂且不可维护，让维护者崩溃却无从下手，只能忍痛默默的重写整个逻辑。这是传统 MVC 模式：&lt;/p&gt;</description></item><item><title>签名机制</title><link>https://hugo-blog-bsg.pages.dev/ios%E8%AF%81%E4%B9%A6%E4%B8%8E%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6/</link><pubDate>Wed, 19 Oct 2016 19:38:31 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/ios%E8%AF%81%E4%B9%A6%E4%B8%8E%E7%AD%BE%E5%90%8D%E6%9C%BA%E5%88%B6/</guid><description>&lt;h2 class="relative group"&gt;我是前言&#10; &lt;div id="我是前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%88%91%e6%98%af%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;签名机制需要了解 非对称加密，摘要，数字签名，证书概念非对称加密解决数据传递的保密性中途窃取无法解开，摘要是数据特性，保持数据的完整，数字签名是非对称加密和摘要的结合。一起解决数据的安全，和完整。证书保证了发送公钥的一方是值得信任的。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;什么是非对称密钥加密？&#10; &lt;div id="什么是非对称密钥加密" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af%e9%9d%9e%e5%af%b9%e7%a7%b0%e5%af%86%e9%92%a5%e5%8a%a0%e5%af%86" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;非对称加密就是指加密密钥和解密密钥是不同的，而且加密密钥和解密密钥是成对出现。非对称加密又叫公钥加密，也就是说成对的密钥，其中一个是对外公开的，所有人都可以获得，或者说可以把这个公钥给很多人，称为公钥，而与之相对应的称为私钥，只有这对密钥的生成者才能拥有。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h3 class="relative group"&gt;非对称密钥的特性&#10; &lt;div id="非对称密钥的特性" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%9d%9e%e5%af%b9%e7%a7%b0%e5%af%86%e9%92%a5%e7%9a%84%e7%89%b9%e6%80%a7" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一个私钥对应一个公钥，公钥可以分发多人&lt;/li&gt;&#10;&lt;li&gt;一个公钥加密后的密文可以通过私钥进行解密，一个私钥加密的密文可以通过公钥进行解密&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h4 class="relative group"&gt;私钥公钥加密用法：&#10; &lt;div id="私钥公钥加密用法" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%a7%81%e9%92%a5%e5%85%ac%e9%92%a5%e5%8a%a0%e5%af%86%e7%94%a8%e6%b3%95" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;对信息保密，将明文经过公钥进行加密，传送给他人，只有拥有私钥的才能解密进行阅读。中途窃取无法解密。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;什么是摘要算法？&#10; &lt;div id="什么是摘要算法" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bb%80%e4%b9%88%e6%98%af%e6%91%98%e8%a6%81%e7%ae%97%e6%b3%95" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;摘要算法是指，可以将任意长度的文本，通过一个算法，得到一个固定长度的文本。&lt;/p&gt;</description></item><item><title>网页输入url到页面展示流程</title><link>https://hugo-blog-bsg.pages.dev/%E7%BD%91%E9%A1%B5%E8%BE%93%E5%85%A5url%E5%88%B0%E9%A1%B5%E9%9D%A2%E5%B1%95%E7%A4%BA%E6%B5%81%E7%A8%8B/</link><pubDate>Sun, 14 Aug 2016 23:05:13 +0000</pubDate><guid>https://hugo-blog-bsg.pages.dev/%E7%BD%91%E9%A1%B5%E8%BE%93%E5%85%A5url%E5%88%B0%E9%A1%B5%E9%9D%A2%E5%B1%95%E7%A4%BA%E6%B5%81%E7%A8%8B/</guid><description>&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;前言&#10; &lt;div id="前言" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e8%a8%80" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;根据时间线，可以分为下面八个过程。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;第一步过程&#10; &lt;div id="第一步过程" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e8%bf%87%e7%a8%8b" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;首先，你得在浏览器里输入要网址:例如百度或者facebook。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;第二步过程&#10; &lt;div id="第二步过程" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e8%bf%87%e7%a8%8b" aria-label="锚点"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;浏览器查找域名的IP地址（域名就是指输入的网址）&lt;/p&gt;</description></item></channel></rss>