- 博客(67)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 iOS 锁的本质:互斥锁、自旋锁、递归锁深度解析
并发编程中锁的本质在于解决多线程竞争共享资源的问题。当多个线程同时访问共享变量时,非原子操作可能导致数据不一致。锁通过互斥机制确保临界区代码的串行执行,提供加锁、解锁等基本操作来控制线程访问权限。锁的分类可从实现方式、等待策略等多个维度划分,其核心是保证复合操作的原子性和线程安全性。
2025-12-25 17:51:31
315
6
原创 iOS 触摸事件完整传递链路:Hit-Test 全流程深度解析
iOS触摸事件主要包括Touch Events(手指触摸、3D Touch、Apple Pencil)、Motion Events(加速度计、陀螺仪)和Remote Events(远程控制)。UITouch对象描述了触摸状态流转(Began→Moved→Ended/Cancelled)及核心属性,如位置、压力、倾斜角度等。UIEvent作为事件容器,可获取所有相关UITouch对象及时间戳,用于处理用户交互行为。
2025-12-16 21:23:17
574
8
原创 iOS 路由机制深度解析:URLRouter & Target-Action & Scheme
iOS主流路由方案对比 本文对比了iOS开发中三种主流的路由方案: URL Router方案(如JLRoutes、MGJRouter): 优点:解耦彻底、支持DeepLink、配置灵活 缺点:参数传递受限、无编译期类型检查、硬编码URL字符串 Target-Action方案(如CTMediator): 优点:无需注册、延迟加载、原生调用 缺点:依赖runtime、方法名硬编码、缺少编译检查 Protocol-Class方案(如BeeHive、Swinject): 优点:类型安全、编译期检查、IDE支持好 缺
2025-12-16 10:14:12
904
1
原创 iOS 组件化:模块拆分、依赖反转、解耦实践
移动端组件化架构设计 本文介绍了移动端组件化架构的核心概念和实施方法。主要内容包括: 痛点分析:传统单体架构存在编译时间长、代码冲突频繁、业务边界模糊等问题 组件分类: 基础组件:纯技术能力封装 功能组件:可复用业务功能 业务组件:具体业务模块 依赖原则: 上层可依赖下层 同层通过协议通信 禁止下层依赖上层和循环依赖 拆分策略: 按业务边界划分 根据团队结构划分 按变更频率划分组件粒度 组件化架构通过分层解耦,实现了独立开发、测试和发布,解决了单体架构的各种痛点。
2025-12-15 18:02:32
1367
原创 iOS In-App Purchase 自动续订订阅完整实现指南
本文摘要: 自动续订订阅是iOS应用变现的核心模式,适用于流媒体、云存储等持续服务场景。文章系统讲解了从配置到实现的完整流程:首先对比各类订阅模式特点,解析订阅生命周期和关键术语;然后详细说明App Store Connect中的订阅组创建、产品配置和服务器通知设置;最后展示客户端StoreKit实现方案,包括产品标识符定义、订阅管理器封装和支付队列观察机制。全文提供可落地的代码示例和技术细节,帮助开发者掌握自动续订订阅的全链路实现。
2025-12-15 11:26:23
1089
原创 Swift 内存管理与循环引用深度解析:从原理到实战
内存问题严重影响App性能,导致卡顿、闪退和耗电。常见问题包括循环引用、闭包捕获self、定时器和通知未释放等。Swift内存管理采用ARC机制,通过引用计数自动管理对象生命周期。内存布局分为栈(存放值类型)、堆(存放引用类型)和全局区域。理解这些原理有助于识别和解决内存泄漏,提升App稳定性。
2025-12-12 20:31:38
898
原创 iOS 包体积优化实战:从 120MB 减到 50MB 的完整指南
移动应用包体积直接影响用户下载转化率和留存率。数据显示,每增加6MB包体积,转化率下降1%,超过200MB需WiFi下载会导致30-50%用户流失。优化路线分四阶段:资源优化(图片/音视频压缩)、代码优化(移除冗余)、第三方库精简、按需加载技术(App Thinning)。通过逐步优化,目标从120MB降至50MB,减少58%体积,显著提升用户体验和市场竞争力。存储压力大的低配设备用户尤其受益。
2025-12-11 09:06:12
682
原创 iOS App 启动优化全流程指南:冷启动与热启动深度解析
iOS应用启动性能对用户体验和商业价值至关重要。本文分析了三种启动类型:冷启动(完整加载,耗时1-3秒)、热启动(部分资源缓存,快20-30%)和恢复启动(后台恢复,<100ms)。启动时间直接影响用户留存,如超过3秒可能导致25-40%留存下降。常见优化挑战包括动态库过多、+load方法滥用、首页复杂度高、初始化任务堆积和主线程阻塞。通过启动类型识别和针对性优化,可显著提升应用性能指标。
2025-12-11 08:49:54
1368
原创 SwiftUI 性能优化完全指南:避免 Body 不必要重新渲染
本文探讨了SwiftUI中视图渲染的性能优化问题。通过代码示例展示了状态变化导致的不必要视图重计算现象,分析了其对CPU、电池、界面流畅度的影响。文章详细解析了SwiftUI视图生命周期的工作原理,包括结构体初始化、body计算、onAppear等阶段,并对比了结构标识与显式标识两种视图标识机制。最后介绍了SwiftUI的视图比较决策流程,为开发者理解性能优化提供了理论基础。
2025-12-10 14:38:12
576
原创 Swift Actor 完全指南:使用场景、性能优化与线程安全
Swift Actor 并发编程模型 Swift Actor 提供了一种线程安全的并发编程方案,解决了传统并发编程中的痛点: 线程安全保证:Actor 通过编译器强制隔离,确保同一时间只有一个任务访问其成员,避免了数据竞争问题。 简化并发编程:相比手动加锁的方案,Actor 自动处理同步问题,开发者无需管理锁机制,减少死锁风险。 访问规则: 外部访问 Actor 成员需要使用 await 关键字 内部方法可以同步访问所有成员 访问其他 Actor 实例仍需 await 与 Class 对比: 都是引用类型
2025-12-10 08:57:00
756
原创 Swift 并发深度指南:Task、Detached Task 与 TaskGroup 完全解析
Swift并发模型包含结构化并发(如async let、TaskGroup)和非结构化并发(如Task{}、Task.detached)。结构化并发自动管理子任务生命周期,支持取消传播和优先级继承;非结构化并发更灵活但需手动管理。Task基础包括创建执行、优先级设置(从.high到.background)、继承特性(上下文、优先级等)和生命周期管理。选择指南建议根据场景选用合适方式,如并行数据获取用async let,动态任务用TaskGroup,UI更新用@MainActor Task等。
2025-12-10 08:12:22
1222
原创 Swift 宏(Swift Macro)完全指南:如何改变你的编程方式
Swift 宏简介 Swift 5.9 引入的宏功能解决了开发中的多个痛点,包括重复样板代码、调试困难等问题。宏是一种编译时代码转换机制,通过读取源代码并生成新代码来优化开发流程。 核心优势 类型安全:生成的代码经过完整类型检查 编译时验证:错误在编译阶段捕获 IDE支持:可展开查看生成代码 可组合性:多个宏可一起使用 宏类型 独立表达式宏(#开头):生成表达式值 独立声明宏(#开头):生成声明 附加成员宏:为类型添加新成员 附加访问器宏:为属性添加访问器 宏相比运行时反射和代码生成工具,提供了更好的类型安
2025-12-09 13:54:20
1000
原创 SwiftUI NavigationStack 完全指南:从入门到精通
本文全面介绍了 SwiftUI 中新一代导航组件 NavigationStack 的核心概念和使用方法。主要内容包括: NavigationStack 的基础架构和工作原理,采用数据驱动方式管理导航栈 与旧版 NavigationView 的对比,展示其编程式导航、状态管理等优势 核心用法演示,包括基本导航、编程式导航和多页面跳转 关键组件 NavigationPath 和 navigationDestination 的深度解析 高级功能如深度链接、状态恢复的实现方案 NavigationStack 解决了
2025-12-09 13:44:15
791
原创 Swift 并发模型深度对比:GCD vs Combine vs Async/Await
本文对比了iOS开发中三种主流并发编程模型:GCD、Combine和Async/Await。GCD作为底层并发框架,基于队列和任务概念,提供多种队列类型和QoS优先级控制,包含异步执行、同步执行、延迟执行、任务组等核心API。Combine采用响应式编程范式,而Async/Await则引入结构化并发。文章详细解析了GCD的队列类型、优先级系统以及常用API,包括DispatchGroup、DispatchSemaphore和DispatchWorkItem等实用工具,为开发者选择适合的并发解决方案提供了技术
2025-12-09 10:35:09
825
原创 SwiftUI 状态管理完全指南:State / Binding / ObservedObject / EnvironmentObject 深度解析
SwiftUI状态管理机制解析 本文深入剖析了SwiftUI中四种核心属性包装器的使用场景和工作原理: @State - 用于视图内部管理的简单值类型状态,生命周期与视图绑定 @Binding - 提供对父视图状态的双向引用,实现父子视图数据同步 @ObservedObject - 管理外部传入的引用类型数据模型 @EnvironmentObject - 实现跨层级视图的数据共享 文章通过对比表格、工作原理图示和代码示例,详细阐述了每种属性包装器的特点、适用场景和常见陷阱。特别强调了@State应仅用于视图
2025-12-09 10:18:21
1243
原创 iOS 内存分配机制:Malloc、VM、Dirty Memory
本文深入解析iOS内存管理机制,从应用层到物理内存,构建完整的层次化认知。系统分为三大核心层面:用户态内存分配器(Malloc)处理不同大小对象分配;虚拟内存系统(VM)管理地址映射和缺页处理;内存页状态(Dirty/Clean)决定内存回收策略。通过架构图和分类表展示iOS内存从应用调用到物理RAM的完整流程,包括Nano Zone、Scalable Zone等分配策略,以及Wired Memory等内存类型特性,为性能优化和问题排查提供理论基础。
2025-12-08 14:36:41
690
1
原创 函数调用栈与野指针崩溃的定位思路
iOS野指针崩溃分析与栈帧原理 野指针崩溃是iOS开发中最难排查的问题之一,具有随机性强、现场迷惑和难以复现的特点。本文从ARM64架构的函数调用栈原理入手,深入分析野指针崩溃的成因。 函数调用栈采用栈帧结构管理,每个栈帧包含局部变量、保存寄存器和返回地址等关键信息。ARM64架构通过SP、FP、LR等寄存器管理栈操作,函数调用时保存FP和LR,返回时恢复。野指针通常发生在释放后仍被访问的内存区域,由于栈帧管理不当导致随机崩溃。理解这些底层机制对定位和解决野指针问题至关重要。
2025-12-08 08:41:44
787
原创 Swift 与 OC 混编底层交互原理
Swift与OC混编机制解析 本文深入探讨了Swift与Objective-C混编的底层实现原理,主要包括: 混编基础架构: 两种混编方向:OC调用Swift(通过自动生成头文件)和Swift调用OC(通过桥接头文件) 关键文件:桥接头文件(xxx-Bridging-Header.h)和自动生成头文件(xxx-Swift.h) 桥接头文件机制: 桥接头文件用于Swift访问OC代码 Swift编译器(Clang Importer)将OC接口转换为Swift可用的模块声明 转换后Swift代码可直接使用OC类
2025-12-08 08:33:30
1059
原创 dyld 加载性能优化:App 启动前到底做了什么
当用户点击 App 图标到看到第一个界面,这短短的几百毫秒内,系统做了大量的工作。这段时间被称为pre-main 阶段,完全由 dyld(Dynamic Loader)主导。理解 dyld 的工作原理,是进行启动优化的基础。本文将深入剖析 dyld 的每一个步骤,并给出针对性的优化策略。│ 启动优化检查清单 ││ ││ 【动态库优化】 ││ □ 自定义动态库数量 ≤ 6 ││ □ 小型工具库转为静态链接 ││ □ 非必要库延迟加载 ││ □ 合并功能相近的 Framework ││ │。
2025-12-05 11:36:18
1162
原创 Mach-O 文件解析:App 二进制的内部结构
本文深入解析了iOS/macOS应用的Mach-O二进制文件格式。主要内容包括:1) Mach-O概述,介绍其作为苹果系统可执行文件格式的特点及常见类型(可执行文件、动态库、插件等);2) 通用二进制文件结构,展示如何通过lipo工具处理多架构文件;3) Mach-O的三大组成部分(Header头部、Load Commands加载命令和Data数据段),为逆向工程、启动优化、安全加固等场景提供底层支持。文章采用图表结合命令示例的方式,清晰展示了Mach-O的内部结构和工作原理。
2025-12-05 09:24:48
945
原创 iOS Crash 本质与捕获修复方案
iOS崩溃的本质是应用运行中发生的错误,主要分为Mach异常(内核层)和Unix信号(BSD层)两种底层机制。常见崩溃类型包括内存访问错误(SIGSEGV/SIGBUS)、OC异常(SIGABRT)、主动终止(SIGABRT)、非法指令(SIGILL)和算术异常(SIGFPE)等。异常传递流程为:硬件/内核错误→Mach异常→BSD信号→进程终止。通过理解这些机制可以更好地定位和解决崩溃问题。
2025-12-04 13:39:42
378
1
原创 iOS 卡顿监控实现:RunLoop + 堆栈采样
本文摘要: 卡顿监控器实现方案采用RunLoop状态监测机制,通过在主线程RunLoop各阶段插入观察者,结合信号量和监控线程实现卡顿检测。核心原理是通过监控RunLoop状态转换耗时,超过阈值时采集主线程调用堆栈。系统包含卡顿级别分类(轻微到致命)、堆栈采样、上下文信息记录等功能,提供可配置的阈值和采样间隔。实现上使用Mach线程API获取主线程信息,结合信号量同步机制确保监控准确性,同时采用互斥锁保护共享状态数据。该方案能有效识别UI卡顿并定位问题代码位置。
2025-12-04 09:09:10
309
原创 RunLoop Mode 深度剖析:为什么滚动时 Timer 会“失效“?
iOS 开发中,RunLoop Mode 切换机制是导致 NSTimer 在滑动 UIScrollView 时失效的根本原因。RunLoop 同一时刻只能运行一个 Mode,系统定义了包括 DefaultMode、TrackingMode 等在内的多种 Mode。当滑动 ScrollView 时,RunLoop 会切换到 UITrackingRunLoopMode,而默认的 Timer 只注册在 DefaultMode 下,因此会被暂停。解决方法是将 Timer 添加到 CommonModes,使其在多个
2025-12-04 09:05:09
1060
原创 RunLoop 深度探索:线程为什么不会自动退出
iOS线程生命周期与RunLoop机制解析 本文深入探讨了iOS中线程的生命周期管理与RunLoop的核心机制。通过分析普通线程执行完毕后自动退出的现象,对比主线程通过RunLoop持续运行的特性,揭示了RunLoop如何控制线程生命周期。文章从源码层面剖析了CFRunLoop的核心循环逻辑,包括事件处理、休眠唤醒机制,以及如何通过RunLoop实现线程常驻。理解这些底层机制对于优化线程管理、避免资源浪费具有重要意义。
2025-12-03 10:22:54
585
原创 大语言模型 (LLM) 在 App 中的集成方式
本文探讨了在移动应用中集成主流大语言模型(LLM)的实践方案。文章对比了三种架构模式:客户端直连、服务端代理和端侧模型,推荐采用服务端代理架构以确保安全性和可控性。详细介绍了包含API网关和LLM服务层的完整架构设计,并对比了OpenAI、Claude等主流LLM服务商的API特性。内容涵盖架构选型、安全防护和多模型集成等核心话题,为开发者提供实用的技术参考。
2025-12-03 10:14:37
1122
1
原创 ARC 的自动释放机制与 autoreleasepool 深度解析
本文深入剖析了iOS开发中ARC与autoreleasepool的内存管理机制。首先回顾了从MRC到ARC的演进历程,指出ARC本质是编译器自动插入retain/release调用而非垃圾回收。重点解析了autorelease的延迟释放原理及其与autoreleasepool的关系,揭示了AutoreleasePoolPage的底层双向链表结构。最后探讨了主线程RunLoop如何自动管理autoreleasepool的生命周期。通过理解这些底层机制,开发者可以更有效地避免内存问题,提升应用性能。
2025-12-02 16:02:18
438
原创 weak 指针是如何在对象释放时被置空的?
本文深入剖析了iOS中weak指针自动置空的底层原理。通过分析Runtime源码,揭示了weak的核心特性:不增加引用计数、对象释放时自动置nil、安全访问nil。重点解析了SideTable数据结构,包括其分离锁设计(8个SideTable减少竞争)、weak_table_t和weak_entry_t的内部结构,展示了弱引用如何通过哈希表存储。当对象释放时,系统会查找对应的weak_entry_t,遍历所有weak指针并将其置为nil,从而实现自动清空功能。
2025-12-02 08:58:21
1357
原创 KVO 底层原理深度解析:为什么监听后对象的 isa 会变?
KVO 实现机制分析:当添加 KVO 监听时,Runtime 会动态生成名为 NSKVONotifying_ClassName 的子类,并将被观察对象的 isa 指针指向该子类。这个子类重写了原类的 setter 方法,在属性修改前后插入通知逻辑。通过改变 isa 指针,KVO 实现了对属性变化的自动监听,同时保持对原类的透明性。移除观察者后,isa 指针会恢复指向原类。
2025-12-02 08:38:37
1030
原创 iOS Block 底层结构与变量捕获原理深度解析
本文深入解析iOS开发中Block的底层实现原理。Block本质上是带有自动变量的匿名函数,编译后会被转换为包含函数指针、捕获变量和描述信息的结构体。通过Clang转换工具可查看其C++实现代码,核心结构包括__block_impl基础结构和具体Block实现。Block分为三种类型:全局Block(不捕获变量)、栈Block(捕获变量但未copy)和堆Block(栈Block调用copy后)。在ARC环境下,作为返回值、被强引用或作为API参数等情况会自动触发栈Block到堆Block的拷贝。理解这些机制
2025-12-01 16:52:47
1360
2
原创 Objective-C 黑魔法:Method Swizzling 的正确姿势与滥用风险
本文深入解析了Objective-C中的Method Swizzling技术,揭示了其核心原理和潜在风险。Method Swizzling通过交换方法指针实现功能替换,是处理无侵入埋点、热修复等场景的利器。文章指出常见错误实践(如直接交换继承方法)会导致"继承污染",并给出了包含dispatch_once、class_addMethod等防护措施的标准范式。同时警示了方法命名冲突、参数改变、调用顺序混乱和调试困难等四大风险,建议仅在埋点、全局UI调整等特定场景谨慎使用。最后强调开发者应掌
2025-12-01 09:15:11
1947
原创 深入底层:彻底搞懂 Objective-C 消息发送(objc_msgSend)的全过程
Objective-C消息发送机制解析:从objc_msgSend到动态转发 本文深入剖析了Objective-C运行时中消息发送的全过程。当执行[receiver message]时,编译器会将其转换为objc_msgSend调用,运行时系统会经历三个关键阶段: 消息查找:首先检查接收者是否为nil,然后在类及其父类的缓存和方法列表中查找方法实现 动态解析:若未找到方法,调用resolveInstanceMethod:提供动态添加方法的机会 消息转发:包括快速转发(forwardingTargetForS
2025-12-01 08:39:59
1242
原创 TableAgent数据分析智能体使用之教育数据分析
在当今数据驱动的时代,有效管理和处理大规模数据变得至关重要。面对这一挑战,九章云极DataCanvas推出了其革命性的产品——TableAgent数据分析智能体,标志着数据处理和分析进入了一个新的时代。在这篇博文中,我们将深入探讨 TableAgent 如何为教育数据分析提供前所未有的便利和效率。TableAgent 不仅仅是一个数据处理工具,它是一个全面的解决方案,旨在简化复杂的数据工作流程。无论是数据的采集、存储、处理还是分析,TableAgent 都能以其先进的技术和直观的操作界面提供卓越的支持。
2023-12-12 15:54:16
4170
77
原创 【腾讯云 HAI域探秘】基于ChatGLM和StableDiffusion的小学一年级语文教学方案创作实践与经验分享
目前腾讯云HAI正在内测中,腾讯云HAI为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在HAI中,根据应用智能匹配并推选出最适合的GPU算力资源,以确保您在数据科学、LLM、AI作画等高性能应用中获得最佳性价比。本文将详细介绍如何使用腾讯云HAI的ChatGLM和StableDiffusion这两个模型。首先是通过ChatGLM模型生成课堂教学方案,然后生成对应的相关提示词和相关的反向提示词,然后通过StableDiffusion模型进行生成相应的图片。
2023-11-02 16:01:10
1114
24
原创 【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发
【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发
2023-07-30 13:58:04
1603
23
原创 macOS上搭建Flutter开发环境
系统要求要安装并运行Flutter,您的开发环境必须满足以下最低要求:操作系统: macOS (64-bit)磁盘空间: 700 MB (不包括Xcode或Android Studio的磁盘空间).工具: Flutter 依赖下面这些命令行工具.bash、mkdir、rm、git、curl、unzip、which获取Flutter SDK去flutter官网下载其最新可用的安...
2019-09-18 14:06:51
511
1
原创 iOS截图那些事
普通view截图+ (UIImage *)gjj_viewScreenShot:(UIView *)view { UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.width, view.frame.size.height ), NO, 0.0); [view.layer renderInCo...
2018-09-06 10:48:18
319
原创 【C实现】给出一个字符串,要求将其按照单词顺序进行反转
题目:给出一个字符串,要求将其按照单词顺序进行反转,比如如果是”the sky is blue”,那么反转之后的结果就是”blue is sky the”。问题分析:每个单词长度不一致空格需要特殊处理使用C语言实现:void swap (char chars[], int p, int q);void reverse (char chars[], int start, ...
2018-08-14 16:06:12
3309
2
原创 QLPreviewController的使用
QLPreviewController在iOS中用于方便预览文件,它支持的文件有: - iWork文档 - 微软Office97以上版本的文档 - RTF文档 - PDF文件 - 图片文件 - 文本文件和CSV文件使用的时候首先要引用#import <QuickLook/QuickLook.h>。 初始化: _qlPreviewController = [[ QLPr
2016-11-23 16:24:48
2220
原创 WebView和H5的那点事
在iOS开发中好多时候,原生的app会很大的限制,也会有好多难以实现的东西。那就需要与H5进行混合开发,那就使用到了webView。 一、首先简单介绍一下webView: 1、三种加载方式:- (void)loadRequest:(NSURLRequest *)request;//这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的- (void)l
2016-11-23 16:00:26
11094
原创 自定义AlertView
今天闲来没事,就进行自定义了一个alertView,进行简单的封装了一下。 目前封装的alertView由title、cancelButton以及confirmButton组成,这里由协议和block两种方法进行实现。 按钮可以自定义,可以显示一个。这个要持续进行更新,以后打算有时间进行细节的修改,以及进行图片等其他需求的增加。 具体直接上部分代码://// XFAlertView.m/
2016-11-11 18:55:09
692
根据要求使用C语言写出逆波兰式
2017-10-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅