<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Shaula Blog</title>
		<link>https://shaula.top/</link>
		<description>Recent content on Shaula Blog</description>
		<generator>Hugo</generator>
		<language>zh-hans</language>
		
		
		
		
			<lastBuildDate>Tue, 23 Jun 2026 22:46:47 +0800</lastBuildDate>
		
			<atom:link href="https://shaula.top/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>iOS OSAllocatedUnfairLock</title>
				<link>https://shaula.top/post/ios-osallocatedunfairlock/</link>
				<pubDate>Tue, 23 Jun 2026 22:46:47 +0800</pubDate>
				<guid>https://shaula.top/post/ios-osallocatedunfairlock/</guid>
				<description>&lt;h1 id=&#34;ios-并发编程的新选择osallocatedunfairlock&#34;&gt;iOS 并发编程的新选择：OSAllocatedUnfairLock&lt;/h1&gt;&#xA;&lt;p&gt;在 iOS 并发编程中，&lt;code&gt;os_unfair_lock&lt;/code&gt; 以其出色的性能，自 iOS 10 起成为替代已废弃 &lt;code&gt;OSSpinLock&lt;/code&gt; 的重要底层同步原语。然而，随着 Swift 语言与并发模型的演进，开发者在直接使用这一底层 C API 时，往往会遇到一些与 Swift 值语义、存储地址稳定性以及 API 易用性相关的问题。&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS 异步操作重试机制</title>
				<link>https://shaula.top/post/ios-%E5%BC%82%E6%AD%A5%E6%93%8D%E4%BD%9C%E9%87%8D%E8%AF%95%E6%9C%BA%E5%88%B6/</link>
				<pubDate>Tue, 23 Jun 2026 22:46:47 +0800</pubDate>
				<guid>https://shaula.top/post/ios-%E5%BC%82%E6%AD%A5%E6%93%8D%E4%BD%9C%E9%87%8D%E8%AF%95%E6%9C%BA%E5%88%B6/</guid>
				<description>&lt;h1 id=&#34;ios-智能重试机制&#34;&gt;iOS 智能重试机制&lt;/h1&gt;&#xA;&lt;p&gt;网络请求、API 调用这种异步操作，失败其实是家常便饭。怎么处理失败、要不要自动重试、怎么重试才能既解决问题又不把服务器搞崩——这几乎是每个 iOS 开发者都会遇到的现实问题。&lt;/p&gt;</description>
			</item>
			<item>
				<title>React Native iOS 编译链接错误排查 - libc&#43;&#43; 缺失</title>
				<link>https://shaula.top/post/react-native-ios-%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5%E9%94%99%E8%AF%AF%E6%8E%92%E6%9F%A5---libc&#43;&#43;-%E7%BC%BA%E5%A4%B1/</link>
				<pubDate>Tue, 23 Jun 2026 22:46:47 +0800</pubDate>
				<guid>https://shaula.top/post/react-native-ios-%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5%E9%94%99%E8%AF%AF%E6%8E%92%E6%9F%A5---libc&#43;&#43;-%E7%BC%BA%E5%A4%B1/</guid>
				<description>&lt;h1 id=&#34;react-native-ios-编译链接错误排查libc-缺失&#34;&gt;React Native iOS 编译链接错误排查：libc++ 缺失&lt;/h1&gt;&#xA;&lt;p&gt;在将 React Native 集成到现有 iOS 项目时，经常会遇到各种编译问题。本文记录了一个典型的链接错误排查过程：项目编译阶段正常通过，但在链接阶段大量 C++ 标准库符号未定义，导致 &lt;code&gt;BUILD FAILED&lt;/code&gt;。通过对比一个能正常编译的参考项目，最终定位并修复了问题。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift 宏系统解析（二）：@freestanding(declaration)</title>
				<link>https://shaula.top/post/swift-%E5%AE%8F%E7%B3%BB%E7%BB%9F%E8%A7%A3%E6%9E%90%E4%BA%8C@freestandingdeclaration/</link>
				<pubDate>Tue, 16 Jun 2026 22:27:28 +0800</pubDate>
				<guid>https://shaula.top/post/swift-%E5%AE%8F%E7%B3%BB%E7%BB%9F%E8%A7%A3%E6%9E%90%E4%BA%8C@freestandingdeclaration/</guid>
				<description>&lt;h1 id=&#34;swift-宏系统解析二freestandingdeclaration&#34;&gt;Swift 宏系统解析（二）：@freestanding(declaration)&lt;/h1&gt;&#xA;&lt;p&gt;在上一篇文章中，我们了解了 &lt;code&gt;@freestanding(expression)&lt;/code&gt; 表达式宏如何消除表达式层面的重复代码。而 &lt;code&gt;@freestanding(declaration)&lt;/code&gt; 声明宏能力更强——它能生成完整的类型、函数、属性等声明，从结构层面解决批量代码的重复问题。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift 宏系统解析（一）：@freestanding (expression) </title>
				<link>https://shaula.top/post/swift-%E5%AE%8F%E7%B3%BB%E7%BB%9F%E8%A7%A3%E6%9E%90%E4%B8%80@freestanding-expression-/</link>
				<pubDate>Tue, 16 Jun 2026 22:27:14 +0800</pubDate>
				<guid>https://shaula.top/post/swift-%E5%AE%8F%E7%B3%BB%E7%BB%9F%E8%A7%A3%E6%9E%90%E4%B8%80@freestanding-expression-/</guid>
				<description>&lt;h1 id=&#34;swift-宏系统解析一freestanding-expression&#34;&gt;Swift 宏系统解析（一）：@freestanding (expression)&lt;/h1&gt;&#xA;&lt;p&gt;Swift 5.9 引入的宏系统为语言带来了编译期元编程能力。在三种宏类型中，&lt;code&gt;@freestanding(expression)&lt;/code&gt; 是最基础也最常用的一种——它能以零运行时开销消除重复代码，同时保持完整的类型安全。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Objective-C 前向声明</title>
				<link>https://shaula.top/post/objective-c-%E5%89%8D%E5%90%91%E5%A3%B0%E6%98%8E/</link>
				<pubDate>Thu, 07 May 2026 22:19:48 +0800</pubDate>
				<guid>https://shaula.top/post/objective-c-%E5%89%8D%E5%90%91%E5%A3%B0%E6%98%8E/</guid>
				<description>&lt;h1 id=&#34;objective-c-前向声明-不止是解决循环引用&#34;&gt;Objective-C 前向声明: 不止是解决循环引用&lt;/h1&gt;&#xA;&lt;p&gt;很多人学 &lt;code&gt;@class&lt;/code&gt; 只是为了解决那个“A 里套 B，B 里套 A”的循环引用报错。其实前向声明真正的能耐远不止这点——它更像一个“编译期防火墙”，用好了能让你从无尽的重新编译里解脱出来。咱们今天把它掰开揉碎，顺便把容易踩坑的地方和更多玩法都聊透。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift 6.1 Package Traits：让依赖管理更灵活</title>
				<link>https://shaula.top/post/swift-6.1-package-traits%E8%AE%A9%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E6%9B%B4%E7%81%B5%E6%B4%BB/</link>
				<pubDate>Wed, 15 Apr 2026 21:16:19 +0800</pubDate>
				<guid>https://shaula.top/post/swift-6.1-package-traits%E8%AE%A9%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86%E6%9B%B4%E7%81%B5%E6%B4%BB/</guid>
				<description>&lt;h1 id=&#34;swift-61-package-traits让依赖管理更灵活&#34;&gt;Swift 6.1 Package Traits：让依赖管理更灵活&lt;/h1&gt;&#xA;&lt;p&gt;Swift 6.1 引入的 &lt;strong&gt;Package Traits&lt;/strong&gt; 为 Swift Package Manager 带来了更灵活的条件编译和可选依赖管理能力。&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么需要它&#34;&gt;为什么需要它？&lt;/h2&gt;&#xA;&lt;p&gt;实际开发中经常遇到这些问题：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;可插拔依赖&lt;/strong&gt;：比如 Swift OpenAPI Generator 支持 URLSession、AsyncHTTPClient、Vapor 等多种传输层。为了不把全部依赖都打进二进制，往往要拆成多个仓库，维护和发现都麻烦。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;平台差异&lt;/strong&gt;：Apple 平台用 OSLog，服务器端用 swift-log，需要一种优雅的方式来处理这种差异。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;实验性 API&lt;/strong&gt;：想发布新功能但又不想承诺稳定 API，加下划线或特殊注解会影响代码补全，不够理想。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;基本用法&#34;&gt;基本用法&lt;/h2&gt;&#xA;&lt;p&gt;在 &lt;code&gt;Package.swift&lt;/code&gt; 中定义特性：&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift - LRU 缓存</title>
				<link>https://shaula.top/post/swift---lru-%E7%BC%93%E5%AD%98/</link>
				<pubDate>Sun, 22 Mar 2026 20:21:51 +0800</pubDate>
				<guid>https://shaula.top/post/swift---lru-%E7%BC%93%E5%AD%98/</guid>
				<description>&lt;h1 id=&#34;swift---lru-缓存&#34;&gt;Swift - LRU 缓存&lt;/h1&gt;&#xA;&lt;h2 id=&#34;什么是-lru-缓存&#34;&gt;什么是 LRU 缓存？&lt;/h2&gt;&#xA;&lt;p&gt;LRU（Least Recently Used，最近最少使用）是一种缓存淘汰策略。当缓存满了，它会优先删除&lt;strong&gt;最久没被访问&lt;/strong&gt;的数据，保留&lt;strong&gt;最近刚用过的&lt;/strong&gt;。&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS 跨平台代码中通过条件编译导入 UIKit 框架代码</title>
				<link>https://shaula.top/post/ios-%E8%B7%A8%E5%B9%B3%E5%8F%B0%E4%BB%A3%E7%A0%81%E4%B8%AD%E9%80%9A%E8%BF%87%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%AF%BC%E5%85%A5-uikit-%E6%A1%86%E6%9E%B6%E4%BB%A3%E7%A0%81/</link>
				<pubDate>Sun, 18 Jan 2026 23:52:13 +0800</pubDate>
				<guid>https://shaula.top/post/ios-%E8%B7%A8%E5%B9%B3%E5%8F%B0%E4%BB%A3%E7%A0%81%E4%B8%AD%E9%80%9A%E8%BF%87%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E5%AF%BC%E5%85%A5-uikit-%E6%A1%86%E6%9E%B6%E4%BB%A3%E7%A0%81/</guid>
				<description>&lt;h1 id=&#34;ios-跨平台代码中条件编译&#34;&gt;iOS 跨平台代码中条件编译&lt;/h1&gt;&#xA;&lt;p&gt;在 iOS 开发中，跨平台代码的条件编译是构建通用框架和组件的常见需求。当你需要针对不同的 Apple 系统平台进行代码适配时，&lt;code&gt;#if canImport(UIKit) &amp;amp;&amp;amp; !os(watchOS)&lt;/code&gt; 和 &lt;code&gt;#if os(iOS)&lt;/code&gt; 这两种条件编译写法各有适用场景。本文将深入解析它们的本质区别，并提供清晰的选用指南。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift 中的 @preconcurrency</title>
				<link>https://shaula.top/post/swift-%E4%B8%AD%E7%9A%84-@preconcurrency/</link>
				<pubDate>Mon, 08 Dec 2025 21:28:47 +0800</pubDate>
				<guid>https://shaula.top/post/swift-%E4%B8%AD%E7%9A%84-@preconcurrency/</guid>
				<description>&lt;h1 id=&#34;swift-中的-preconcurrency&#34;&gt;Swift 中的 @preconcurrency&lt;/h1&gt;&#xA;&lt;p&gt;随着 Swift 并发模型的成熟，开发者在集成旧代码或第三方库时面临着一个挑战：如何在严格的并发检查下使用非并发安全的 API？&lt;code&gt;@preconcurrency&lt;/code&gt; 属性包装器正是为解决这一问题而生。&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS - VIPER 架构</title>
				<link>https://shaula.top/post/ios---viper-%E6%9E%B6%E6%9E%84/</link>
				<pubDate>Fri, 24 Oct 2025 20:19:54 +0800</pubDate>
				<guid>https://shaula.top/post/ios---viper-%E6%9E%B6%E6%9E%84/</guid>
				<description>&lt;h2 id=&#34;ios---viper-架构&#34;&gt;iOS - VIPER 架构&lt;/h2&gt;&#xA;&lt;p&gt;iOS 中的 VIPER 架构是 Clean Architecture 的具体实现之一，强调职责分离和模块化设计，特别适合中大型项目。VIPER 的名称由五个核心组件的首字母组成，各个组件的职责明确，协作流程清晰。&lt;/p&gt;</description>
			</item>
			<item>
				<title>SwiftUI 中的 ViewBuilder</title>
				<link>https://shaula.top/post/swiftui-%E4%B8%AD%E7%9A%84-viewbuilder/</link>
				<pubDate>Fri, 24 Oct 2025 20:19:54 +0800</pubDate>
				<guid>https://shaula.top/post/swiftui-%E4%B8%AD%E7%9A%84-viewbuilder/</guid>
				<description>&lt;h1 id=&#34;swiftui-中的-viewbuilder&#34;&gt;SwiftUI 中的 ViewBuilder&lt;/h1&gt;&#xA;&lt;p&gt;在 SwiftUI 的声明式语法背后，有一个强大的功能在默默地工作，让我们的界面代码如此优雅简洁——这就是 &lt;code&gt;ViewBuilder&lt;/code&gt;。作为 Swift 语言中&lt;code&gt;Result Builder&lt;/code&gt;特性的一个具体实现，&lt;code&gt;ViewBuilder&lt;/code&gt; 彻底改变了我们构建视图层次结构的方式。&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS UIButtonConfiguration</title>
				<link>https://shaula.top/post/ios-uibuttonconfiguration/</link>
				<pubDate>Tue, 09 Sep 2025 22:38:35 +0800</pubDate>
				<guid>https://shaula.top/post/ios-uibuttonconfiguration/</guid>
				<description>&lt;h2 id=&#34;ios-uibuttonconfiguration&#34;&gt;iOS UIButtonConfiguration&lt;/h2&gt;&#xA;&lt;p&gt;UIButtonConfiguration 是 iOS 15+ 引入的 API，它将按钮的样式、状态管理与内容组织提升到了全新高度。&lt;/p&gt;&#xA;&lt;h3 id=&#34;为何需要-uibuttonconfiguration&#34;&gt;为何需要 UIButtonConfiguration？&lt;/h3&gt;&#xA;&lt;p&gt;传统 &lt;code&gt;UIButton&lt;/code&gt; 配置痛点(繁琐且易出错)：&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS 后台任务革新 - BGTaskScheduler</title>
				<link>https://shaula.top/post/ios-%E5%90%8E%E5%8F%B0%E4%BB%BB%E5%8A%A1%E9%9D%A9%E6%96%B0---bgtaskscheduler/</link>
				<pubDate>Mon, 25 Aug 2025 23:01:34 +0800</pubDate>
				<guid>https://shaula.top/post/ios-%E5%90%8E%E5%8F%B0%E4%BB%BB%E5%8A%A1%E9%9D%A9%E6%96%B0---bgtaskscheduler/</guid>
				<description>&lt;h1 id=&#34;ios-后台任务革新-bgtaskscheduler&#34;&gt;iOS 后台任务革新: BGTaskScheduler&lt;/h1&gt;&#xA;&lt;p&gt;在 iOS 13 之前，后台任务执行一直是个难题——开发者需要小心翼翼地在系统限制下工作，而用户则常常为电池续航担忧。苹果推出的 &lt;strong&gt;&lt;code&gt;BGTaskScheduler&lt;/code&gt;&lt;/strong&gt; 框架彻底改变了这一局面，它提供了一套系统友好、高度节能的后台任务调度机制，让应用能在后台智能执行关键任务，同时最大限度减少对设备性能和电池的影响。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift DFS 与 BFS 算法</title>
				<link>https://shaula.top/post/swift-dfs-%E4%B8%8E-bfs-%E7%AE%97%E6%B3%95/</link>
				<pubDate>Mon, 25 Aug 2025 23:01:34 +0800</pubDate>
				<guid>https://shaula.top/post/swift-dfs-%E4%B8%8E-bfs-%E7%AE%97%E6%B3%95/</guid>
				<description>&lt;h1 id=&#34;swift-中的-dfs-与-bfs-算法&#34;&gt;Swift 中的 DFS 与 BFS 算法&lt;/h1&gt;&#xA;&lt;p&gt;最近在开发过程中需要实现树形结构的选中状态联动（包括全选、部分选和未选状态），这里使用到了树的遍历算法。深度优先搜索（DFS）和广度优先搜索（BFS）是两种常用的图/树遍历算法，它们的主要区别在于访问节点的顺序：&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS 动态方法调用 - NSInvocation</title>
				<link>https://shaula.top/post/ios-%E5%8A%A8%E6%80%81%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8---nsinvocation/</link>
				<pubDate>Tue, 29 Jul 2025 21:36:47 +0800</pubDate>
				<guid>https://shaula.top/post/ios-%E5%8A%A8%E6%80%81%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8---nsinvocation/</guid>
				<description>&lt;h2 id=&#34;ios-动态方法调用---nsinvocation&#34;&gt;iOS 动态方法调用 - NSInvocation&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;NSInvocation&lt;/code&gt; 是 iOS/macOS 开发中 Objective-C 运行时的一个核心类，它用于&lt;strong&gt;封装并动态调用方法&lt;/strong&gt;。该类允许将方法调用（包括目标对象、方法选择器、参数和返回值）存储为一个对象，从而实现延迟执行或跨上下文传递。&lt;/p&gt;</description>
			</item>
			<item>
				<title>iOS UIAction</title>
				<link>https://shaula.top/post/ios-uiaction/</link>
				<pubDate>Thu, 10 Jul 2025 21:42:33 +0800</pubDate>
				<guid>https://shaula.top/post/ios-uiaction/</guid>
				<description>&lt;h2 id=&#34;ios-uiaction&#34;&gt;iOS UIAction&lt;/h2&gt;&#xA;&lt;p&gt;在上一篇文章我们介绍了如何使用 &lt;code&gt;UIButtonConfiguration&lt;/code&gt; 对按钮的样式与状态进行管理，这篇文章介绍下可以同 &lt;code&gt;UIButtonConfiguration&lt;/code&gt; 结合使用的一个类：UIAction.&lt;/p&gt;&#xA;&lt;h3 id=&#34;什么是-uiaction&#34;&gt;什么是 &lt;code&gt;UIAction&lt;/code&gt;？&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;UIAction&lt;/code&gt; 是在 iOS 14 中引入的一个类，它封装了一个动作（action）以及该动作的相关属性（例如标题、图像、属性等）。你可以把它看作是一个将动作（闭包）和按钮的某些属性（如标题、图像）打包在一起的对象。它在 UIButton(configuration:primaryAction:) 初始化方法中作为参数，用于定义按钮的主要点击行为。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift RegexBuilder</title>
				<link>https://shaula.top/post/swift-regexbuilder/</link>
				<pubDate>Tue, 10 Jun 2025 00:05:59 +0800</pubDate>
				<guid>https://shaula.top/post/swift-regexbuilder/</guid>
				<description>&lt;h2 id=&#34;swift-regexbuilder&#34;&gt;Swift RegexBuilder&lt;/h2&gt;&#xA;&lt;p&gt;在 Swift 5.7 中，苹果引入了全新的 &lt;strong&gt;RegexBuilder&lt;/strong&gt; 框架，彻底改变了开发者处理正则表达式的范式。告别晦涩难懂的正则符号，拥抱类型安全、模块化且可读性强的 DSL（领域特定语言），本文将带你探索 RegexBuilder 的强大能力。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift Actor隔离机制详解</title>
				<link>https://shaula.top/post/swift-actor%E9%9A%94%E7%A6%BB%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3/</link>
				<pubDate>Wed, 28 May 2025 22:39:13 +0800</pubDate>
				<guid>https://shaula.top/post/swift-actor%E9%9A%94%E7%A6%BB%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3/</guid>
				<description>&lt;h1 id=&#34;swift-actor隔离机制详解&#34;&gt;Swift Actor隔离机制详解&lt;/h1&gt;&#xA;&lt;p&gt;在 Swift 中，Actor 的 &lt;code&gt;actor-isolated&lt;/code&gt; 机制是用于确保并发安全的核心理念。以下是对你引用的那段话的分步解释：&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;1-actor-的默认隔离规则&#34;&gt;1. &lt;strong&gt;Actor 的默认隔离规则&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;所有声明默认是 actor-isolated&lt;/strong&gt;：当你在一个 Actor 类型内部声明属性或实例方法时，它们默认会被标记为 &lt;code&gt;actor-isolated&lt;/code&gt;（即“隔离到该 Actor 实例”）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;目的&lt;/strong&gt;：这种隔离保证了同一时间只能有一个任务（Task）访问这些属性和方法，从而避免数据竞争（Data Race）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;actor BankAccount {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;balance&lt;/span&gt;: &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;Double&lt;/span&gt; = &lt;span style=&#34;color:#bd93f9&#34;&gt;0.0&lt;/span&gt;  &lt;span style=&#34;color:#6272a4&#34;&gt;// actor-isolated 属性&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;deposit&lt;/span&gt;(amount: &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;Double&lt;/span&gt;) { &lt;span style=&#34;color:#6272a4&#34;&gt;// actor-isolated 方法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        balance &lt;span style=&#34;color:#ff79c6&#34;&gt;+=&lt;/span&gt; amount&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;2-同一-actor-内部的自由访问&#34;&gt;2. &lt;strong&gt;同一 Actor 内部的自由访问&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;隔离环境内的自由调用&lt;/strong&gt;：在 Actor 隔离的上下文（如 Actor 的方法内部）中，你可以直接访问同一 Actor 的其他 &lt;code&gt;actor-isolated&lt;/code&gt; 声明，无需额外同步。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;extension&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;BankAccount&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;withdraw&lt;/span&gt;(amount: &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;Double&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6272a4&#34;&gt;// 可以直接访问 balance 和 deposit，因为它们在同一个隔离域&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; balance &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;=&lt;/span&gt; amount {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            deposit(amount: &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;amount) &lt;span style=&#34;color:#6272a4&#34;&gt;// 无需 await&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;3-外部代码的异步访问&#34;&gt;3. &lt;strong&gt;外部代码的异步访问&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;非隔离代码的访问限制&lt;/strong&gt;：如果代码不在 Actor 的隔离环境中（例如普通函数、其他 Actor 的方法或非隔离方法），则必须通过 &lt;code&gt;await&lt;/code&gt; 异步访问 &lt;code&gt;actor-isolated&lt;/code&gt; 声明。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;externalTransfer&lt;/span&gt;(from account: BankAccount, to anotherAccount: BankAccount) async {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6272a4&#34;&gt;// 必须用 await 调用 actor-isolated 方法&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    await account.deposit(amount: &lt;span style=&#34;color:#bd93f9&#34;&gt;100.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6272a4&#34;&gt;// 必须用 await 读取 actor-isolated 属性&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;balance&lt;/span&gt; = await account.balance&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;4-非隔离声明-&#34;&gt;4. &lt;strong&gt;非隔离声明 (&lt;code&gt;nonisolated&lt;/code&gt;) 的特殊性&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;标记为 &lt;code&gt;nonisolated&lt;/code&gt;&lt;/strong&gt;：若某个方法或属性不需要访问 Actor 内部状态，可以显式标记为 &lt;code&gt;nonisolated&lt;/code&gt;。此时，它可以直接被同步调用，但内部无法访问其他 &lt;code&gt;actor-isolated&lt;/code&gt; 成员。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;extension&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;BankAccount&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nonisolated &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;accountID&lt;/span&gt;: &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;String&lt;/span&gt; { &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6272a4&#34;&gt;// 不访问 balance 或其他隔离成员，可以是非隔离的&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;ACCT-12345&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nonisolated &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;logID&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-style:italic&#34;&gt;print&lt;/span&gt;(accountID) &lt;span style=&#34;color:#6272a4&#34;&gt;// ✅ 允许：访问非隔离属性&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6272a4&#34;&gt;// print(balance) ❌ 错误：无法访问 actor-isolated 属性&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h3 id=&#34;5-为什么需要这样设计&#34;&gt;5. &lt;strong&gt;为什么需要这样设计？&lt;/strong&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;数据竞争的预防&lt;/strong&gt;：通过强制外部代码异步访问（排队等待 Actor 处理），确保同一时间只有一个任务修改 Actor 内部状态。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：Actor 内部的同步访问是高效的（无锁），而外部异步访问通过编译器检查保证安全。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;总结表格&#34;&gt;总结表格&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;上下文&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;能否直接访问 &lt;code&gt;actor-isolated&lt;/code&gt; 成员？&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;是否需要 &lt;code&gt;await&lt;/code&gt;？&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;同一 Actor 的方法内部&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;✅ 是&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;❌ 否&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;外部代码&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;❌ 否（需通过 Actor 引用）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;✅ 是&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;nonisolated&lt;/code&gt; 方法&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;❌ 否&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;❌ 否（不能访问）&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;通过这种机制，Swift 的 Actor 在编译阶段就能检测出潜在的数据竞争，使得并发代码更安全且易于维护。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swift 中的 Scanner 类</title>
				<link>https://shaula.top/post/swift-%E4%B8%AD%E7%9A%84-scanner-%E7%B1%BB/</link>
				<pubDate>Mon, 26 May 2025 21:52:28 +0800</pubDate>
				<guid>https://shaula.top/post/swift-%E4%B8%AD%E7%9A%84-scanner-%E7%B1%BB/</guid>
				<description>&lt;h2 id=&#34;swift-中的-scanner-类&#34;&gt;Swift 中的 Scanner 类&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;Scanner&lt;/code&gt; 是 Swift 标准库中一个用于解析结构化字符串的实用工具类。它能够逐步扫描字符串内容，并从中提取特定类型的数据（如整数、浮点数、子字符串等），特别适用于处理格式化文本数据或自定义协议解析。&lt;/p&gt;</description>
			</item>
			<item>
				<title>SwiftUI Modifier 功能与使用详解</title>
				<link>https://shaula.top/post/swiftui-modifier-%E5%8A%9F%E8%83%BD%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/</link>
				<pubDate>Tue, 15 Apr 2025 21:36:44 +0800</pubDate>
				<guid>https://shaula.top/post/swiftui-modifier-%E5%8A%9F%E8%83%BD%E4%B8%8E%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/</guid>
				<description>&lt;h2 id=&#34;swiftui-modifier-功能与使用详解&#34;&gt;SwiftUI Modifier 功能与使用详解&lt;/h2&gt;&#xA;&lt;p&gt;在 SwiftUI 中，&lt;strong&gt;Modifier（修饰符）&lt;/strong&gt; 是一种用于修改或装饰视图的强大工具。它们允许你以声明式的方式调整视图的外观、布局或行为，而无需直接更改视图本身。Modifier 是 SwiftUI 设计理念的核心部分，遵循函数式编程的思想，通过链式调用来组合多个效果。&lt;/p&gt;</description>
			</item>
			<item>
				<title></title>
				<link>https://shaula.top/about/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://shaula.top/about/</guid>
				<description>&lt;h2 id=&#34;关于我&#34;&gt;关于我&lt;/h2&gt;&#xA;&lt;p&gt;Hi，我是一位 iOS 开发者。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Posts Archive</title>
				<link>https://shaula.top/archive/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://shaula.top/archive/</guid>
				<description></description>
			</item>
	</channel>
</rss>
