Welcome CodrStar’s Blog

  • 👋 Hello,我是 CoderStar,目前在北京。想要发展的方向是大前端,包括但不限于 iOS、Android、Flutter 及 Vue 等,对 Java 后端也有一定了解,目前主要的工作还是与 iOS 相关。
  • 📖 平时会写一些技术文章,同步到 掘金微信公众号,希望可以和大家一起进行技术探讨和交流;微信公众号: CoderStar,欢迎大家订阅!
  • ✉️ 如果你想联系我,可以给我发邮件

当Swift中的lazy、weak碰上NSObject

前言 Hi Coder,我是 CoderStar! 今天给大家介绍一个我遇到的小坑。过程大概是这样的,一个复用页面通过不同的入口进入,等返回时,有的正常,有的却出现了 Crash,log 信息如下。 Cannot form weak reference to instance XXXXXX. It is possible that this object was over-released, or is in the process of deallocation. 然后看了一下 Crash 时候的调用栈,发现崩溃在 deinit 时 KVO 释放 Observer 的过程中。一段排查之后,新的坑点出炉了。 具体业务代码就不贴了,贴一个能触发 Bug 的 Demo 吧(不包含使用合理性,仅用来测试 Crash)。 问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 protocol MyServiceDelegate: AnyObject {} class MyService { weak var delegate: MyServiceDelegate? func stop() {} } class MyClass: NSObject, MyServiceDelegate { private lazy var service: MyService = { let service = MyService() service.delegate = self return service }() deinit { service.stop() } } // 测试 func test() { let myClass = MyClass() } 大家觉得这段代码会发生什么?可能大家看了上面的介绍心中已经有了预想的答案。是的,跟上面 Crash 报错信息一致。 ...

November 21, 2024 · 3 min · 444 words · CoderStar

从SIL角度看Swift中的值类型与引用类型

前言 Hi Coder,我是 CoderStar! 在 Swift 开发过程中,你很可能至少问过自己一次 struct 与 class 之间的区别,即使你自己没问过,你的面试官应该也问过。对这个问题的答案中,可能最大的区别就是一个是值类型,而另一个是引用类型,今天我们就来具体聊聊这个区别。 那在介绍值类型与引用类型之前,我们还是先来回顾一下 struct 与 class 之间的区别这个问题。 class & struct 在 Swift 中,其实 class 与 struct 之间的核心区别不是很多,有很多区别是值类型与引用类型这个区别隐形带来的天然的区别。 class 可以继承,struct 不能继承(当然 struct 可以利用 protocol 来实现类似继承的效果。);受此影响的区别有: struct 中方法的派发方式全都是直接派发,而 class 中根据实际情况有多种派发方式,详情可看 Swift派发机制; class 需要自己定义构造函数,struct 默认生成; struct 默认生成的构造函数必须包括所有成员参数,只有当所有参数都为可选型时,可直接不用传入参数直接简单构造,class 中的属性必须都有默认值,否则编译错误, 可以通过声明时赋值或者构造函数赋值两种方式给属性设置默认值。 class 是引用类型,struct 是值类型;受此影响的区别有: struct 改变其属性受修饰符 let 影响,不可改变,class 不受影响; struct 方法中需要修改自身属性时 (非 init 方法),方法需要前缀修饰符 mutating; struct 因为是值类型的原因,所以自动线程安全,而且也不存在循环引用导致内存泄漏的风险; … 更多看下一章节 … 在 Swift 中,很多基础类型,如 String,Int 等等,都是使用 Struct 来定义。对于如何选择两者这个问题上,Apple 在一些官方文档中也给出了它们之间的区别以及官方建议。 ...

November 21, 2024 · 8 min · 1573 words · CoderStar

关于CocoaPods之Nexus、JFrog

前言 Hi Coder,我是 CoderStar! 好久没有输出文章了,好多朋友都开始私信或在群里问我是不是后面不继续更新了。😂,其实不是哈,主要是最近这段时间比较忙,确实没有太多的精力往外输出了。 今天给大家总结一下前段时间关于 CocoaPods 的一些工程实践。 包管理器 关于包管理系统,每个语言都会有自己的包管理系统,比如 java 系的 maven、gradle,rust 的 cargo,nodejs 的 npm… 可以说,一个好用的包管理器对一个语言而言是至关重要的,但是说起 iOS 相关语言的包管理器,真是一言难尽,将包完全托管到 Github 上这个方案虽然从节省成本角度而言不乏是个好主意,但是确实也会大幅降低开发者的开发体验,在国内尤甚。 吐槽的话就不说太多了,大家都懂的 关于 iOS 相关语言的包管理器,也有好几种 CocoaPods 使用占比最高,库支持多,但是对项目的侵入性比较强; Carthage 库支持较少,侵入性较弱; SPM 官方支持,虽然现在还不是很好用,但是随着 Swift 的持续推进,SPM 也是会成为未来的趋势; 目前市面上用的最多的还是 CocoaPods,今天我们也主要谈谈该种方式,另外几种方式,我们后面有机会再继续。 大家都知道,CocoaPods 的远程存储是由一个中心索引库 + 离散化的制品库(git 源,OSS 等等)组成的,最开始中心索引库是一个 Github Repo,但随着库的增多,仓库大小也持续增加。后续 CocoaPods 为了解决这部分的问题,将中心索引库迁移到了 CDN,使中心索引库根据依赖的库进行按需下载。 但是这样也只是解决了中心索引库的下载问题,但是对于索引库依赖的制品库却没有丝毫的帮助,对于绝大部分三方库,我们还是需要从 Github 进行下载,那对于这种问题如何解决呢? 市面上也会有一些方案,比如: 利用 Gitee 进行导入。该种方式会受到 Gitee 平台的限制,还需要配套研发对应的工具去做自动化。从公司的角度去考虑,这种受外部平台限制很大的方案一般都很难去落地。 其他各种加快 Github 访问的方案; 那还有没有更好的方案呢?那就是我接下来要介绍的 Nexus 以及 JFrog 。 Nexus&JFrog 制品库都是 Nexus 和 JFrog 的产品之一,除此之外,还会有其他产品。 ...

November 21, 2024 · 3 min · 428 words · CoderStar

Xcode Concepts

前言 Hi Coder,我是 CoderStar! 不知道大家会不会思考这样的问题? xcodebuild 命令的几个参数怎么填,到底是填 scheme,还是填 target,亦或是其他的? CocoaPods 是如何将库与工程组合到一起的? 多环境配置出包的是选择多 target 方案还是多 configuration 方案? … 带着这些问题我们走进今天的文章,了解 Xcode 的各种 Concepts。 Xcode 有比较多的概念,如下有: Workspace Project Target Scheme Build Setting(Xcconfig) Configurations Product 是不是有一种感觉:看着就很熟悉,但细细去解释又感觉有点吃力。接下来我们就一起来沿着我的思路回顾一下这些概念。 概念之间是相辅相成的,需要带着整体的思维去理解这些概念,不同章节之间记得联系起来看。 官方对这些概念的解释可以看这篇文档:Xcode Concepts Product Product 顾名思义就是 产物,这也是我们使用 Xcode 最终想要生成的东西,这些产物按照 Mach-O Type 来划分包括: Executable Dynamic Library Static Library Bundle … 这个产物便是我们最终想通过 Xcode 得到的目标产物,那我们怎么得到这个产物呢,那就涉及到下方的概念了。 Target 一个 Target 来描述(或者叫做生产)一个 Product,那它是怎么描述这个产物呢? 也可以把 Target 理解成一个最小的编译单元; <!DOCTYPE html> Responsive Image ...

November 20, 2024 · 3 min · 478 words · CoderStar

Xcode Tips

前言 Hi Coder,我是 CoderStar! 今天我们不聊技术原理,咱们聊点简单轻松的,也就是我们 iOSer 几乎每天都会用到的 Xbug。Xcode 虽然确实会有很多 Bug,一些设计也不如 JB 家做的好,但是还是有一些可取之处的,比如页面简洁…,嗯…,好像就这一个? 哈哈,简单开个玩笑,回到正题。虽然我们经常使用 Xcode,但是有些功能还是需要我们自己特意去发现一下。今天我们就来聊聊 Xcode 的一些 Tips。 本文涉及的 Tips 主要是一些相对通用的,还有一些相对专一点的,比如断点、Instruments 等后面再单独介绍。有些 Tips 可能对于老司机们已经习以为常了,还望不要嫌太低级,如果还有一些文中没有体现的 Tips,还望指教。 编辑相关 Refactor 我们把光标放在类上或者方法上右键选中 Refactor,其会显示出对其光标处可以进行的自动补全的一些操作;如下图所示: <!DOCTYPE html> Responsive Image ...

November 20, 2024 · 2 min · 367 words · CoderStar

Xcode常见CLI工具

前言 Hi Coder,我是 CoderStar! 在新的一年里,祝小伙伴们工作顺利,升职加薪。 在咱们日常开发中,或多或少都会用到 Xcode 内置的一些 CLI 工具,但是大部分小伙伴可能只是会用到一些具体的命令,今天我们就一起来聊一聊 Xcode 内置的常见 Command Line Tool。 介绍的可能不全,大家可以去文中出现的路径下查看更多的工具。 Command Line Tool 本质是一个命令行工具包,内部有很多有用的工具,如 Apple LLVM compiler、Make 等等。并且并不是只有开发 Apple 应用程序才需要用到这些工具包,当我们下载 Homebrew 时,在安装过程中也会下载 Command Line Tool。 下文会对 Command Line Tool 直接缩写成 CLI,XXX 一般情况是指对应路径地址。 我们在开发者官网 Command Line Tool 对其单独下载,当然每个版本的 Xcode 安装包内也会包含这套工具包。 其实下列有一部分工具属于 LLVM 序列,比如 dwarfdump、ar,启动本质其实为 llvm-dwarfdump、llvm-ar,都属于 LLVM 工具链中的一部分。 前置工具 在我来介绍这套工具包其他工具之前,我先来介绍两个工具,我称它们为前置工具,因为有了这两个工具,我们才能更好的使用其他的工具。 xcode-select 这个工具可以帮助我们下载及安装 CLI,比手动下载更便捷。并且还能解决另外问题,就是如果我们装有多个 Xcode,我们在使用 CLI 相关工具时,系统就会不知道该去使用哪个版本或者哪个位置的 CLI,使用这个工具可以帮助我们设置及切换当前默认使用的 CLI。 介绍该工具常见的命令: xcode-select --install: 安装 CLI,会安装到 /Library/Developer/CommandLineTools/ xcode-select -p: 显示当前指定的工具包所在 Xcode 路径 xcode-select -s <path>: 切换默认工具包所在 Xcode 路径 xcode-select -r: 重置工具包所在 Xcode 路径 xcode-select 提供了一个环境变量,让你能临时使用其他环境来执行 xcode command,env DEVELOPER_DIR="/Applications/Xcode-beta.app" /usr/bin/xcodebuild ...

November 20, 2024 · 7 min · 1463 words · CoderStar

设计模式 - 命令模式&中介者模式&组合模式~AppDelegate 解耦

前言 Hi Coder,我是 CoderStar! 今天主要给大家分享的内容是三种设计模式 (命令模式、中介者模式以及组合模式) 及其它们在 AppDelegate 解耦场景下的应用,特别是组合模式,沉淀出相应的轮子分享给大家。 同时也给大家说下后面关于设计模式系列的文章计划,因为设计模式相关文章会结合我们开发中实际上会遇到的场景进行整理,所以发文可能不连续,希望大家理解,我会将大部分设计模式的代码示例全部整理到 DesignPatternsDemo 仓库中,形式为 Playground,所以代码示例中可能会有一些手动调用系统函数的情况出现。 同时给大家推荐一个学习设计模式的好网站 –深入设计模式,文章中涉及的部分 UML 图也来自该网站。 场景 AppDelegate 是应用程序的根对象,即唯一代理,可以认为是每个 iOS 项目的核心。 其提供应用程序生命周期事件的暴露; 其确保应用程序与系统以及其他应用程序正确的交互; 其通常承担很多职责,这使得很难进行更改,扩展和测试。 随着业务的迭代升级,不断增加新的功能和业务,AppDelegate 中的代码量也不断增长,致使其 Massive。AppDelegate 中常见的业务会包括: 生命周期中的事件处理及传播; 管理 UI 堆栈配置:选择初始视图控制器,执行根视图控制器转换; 管理后台任务; 管理通知; 三方库初始化; 管理设备方向; 设置 UIAppearance; … 并且因为 AppDelegate 会影响整个 APP,所以在面对复杂的 AppDelegate 时,我们就会小心翼翼,生怕自己自己的改动影响到其他的功能。所以说 AppDelegate 的简洁和清晰对于健康的 iOS 架构来说是至关重要的。 下面我们利用上述三种设计模式实现对 AppDelegate 的解耦,使其优雅。 命令模式 命令模式(Command) 是一种 行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。 UML <!DOCTYPE html> Responsive Image ...

November 18, 2024 · 5 min · 1052 words · CoderStar

iOS优化-瘦身

前言 Hi Coder,我是 CoderStar! iOS 优化将是一个专题,其中会包括包体积优化(瘦身)、启动时间优化、UI 优化等等。那么这个专题的开篇就从瘦身开始吧。 APP 的大小是分为 APP 下载大小和安装大小两个概念的。 下载大小是指 App 压缩包(也就是 .ipa 文件)所占的空间,用户在下载 App 时,下载的是压缩包,这样做可以节省流量; 当压缩包下载完成后,就会自动解压,解压过程也就是通常所说的安装过程;安装大小就是指压缩包解压后所占用的空间。 用户在商店看到的大小是安装大小。如果想看安装包在各机型上最准确的下载、安装大小可以在 App Store Connect 后台查看。 <!DOCTYPE html> Responsive Image 其实一般情况来讲,导出的 ipa 文件越小,其下载大小会越小,我们可以将 ipa 文件尺寸作为量化参数,但是更准确的数值还是需要看 App Store Connect 上的下载大小。 ...

November 16, 2024 · 10 min · 1930 words · CoderStar