概述iOS开发中,由于UIKit的非线程安全性,所有UI操作必须在主线程执行。系统每16ms(1/60帧)重绘UI至屏幕。若主线程进行耗时操作或发生死锁,会阻碍UI刷新,导致卡顿甚至卡死。主线程基于Runloop机制处理任务,Runloop支持多种事件回调,包括事件进入、处理前后等时机。若主线程在任一环节被阻塞,会导致UI和交互都无法进行,这是卡死、卡顿的根本原因。
线程和锁线程和...
🔗 LeetCode 141 - Linked List Cycle
📌 题目描述给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。
示例:
12输入:head = [3,2,0,-4], pos = 1输出:true
💡 解题思路使用快慢指针:
慢指针...
一、基本介绍
方面
GCD
NSOperation
所属框架
C 语言底层 API,Foundation 框架
Foundation 框架的面向对象封装
编程范式
函数式(Block)
面向对象(Operation 对象)
线程管理
自动管理线程
基于 NSOperationQueue,封装良好
适用场景
性能优先,轻量并发控制
更复杂的任务依赖和管理需求
二、核心...
🔗 LeetCode 15 - 三数之和
📌 题目描述给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]],满足:
12i ≠ j、i ≠ k 且 j ≠ knums[i] + nums[j] + nums[k] == 0
请你返回所有和为 0 且不重复的三元组。你不能包含重复的三元组。
示例:
12输入:nums = [-1,0,1,...
一、GCD 队列底层原理1.1 队列类型
串行队列:一次只执行一个任务。
并发队列:可以并发执行多个任务。
主队列:主线程的串行队列,用于更新 UI。
1.2 队列背后的线程
GCD 使用 线程池 管理线程,具体由 libdispatch + pthread 实现。
并发队列任务实际是串行调度、并发执行(由系统根据线程池和资源自动调度)。
二、常见 GCD 高级用法2.1 dispatc...
图像显示原理iOS 图像显示的原理涉及多个层次,从底层的硬件加速到上层的框架实现。UIKit 提供了高层次的 API,用于管理应用的用户界面元素,包括视图、控件和图像显示。UIImageView 是 UIKit 中用于显示图像的主要类。Core Graphics (也称为 Quartz) 是 iOS 的 2D 绘图引擎。它直接与硬件交互,负责图形的绘制和处理。UIKit 的许多绘图操作最终都...
语法基础变量变量是可变的,使用 var 修饰,常量是不可变的,使用 let 修饰。类、结构体和枚举里的变量是属性。
12345678910var v1:String = "hi" // 标注类型var v2 = "类型推导"let l1 = "标题" // 常量class a { let p1 = 3 var ...
🔗 LeetCode 136 - Single Number
📌 题目描述给定一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须在线性时间复杂度内完成算法,并且不能使用额外空间。
示例:
12输入: [4,1,2,1,2]输出: 4
💡 解题思路
异或运算的关键特性:
a ^ a = 0
a ^ 0 = a
所以...
iOS RunLoop 卡顿优化指南一、理解 RunLoop 卡顿的本质1. RunLoop 基本机制RunLoop 本质上是一个事件循环机制,主要用于线程的任务调度。在主线程中,RunLoop 负责处理:
触摸事件
定时器事件(NSTimer、CADisplayLink)
UI 渲染
GCD 主队列任务
系统事件(比如键盘弹出)
2. 卡顿现象原因主线程卡顿的本质是 RunLoop 长...
🔗 LeetCode 125 - Valid Palindrome
📌 题目描述给定一个字符串,判断它是否是回文,只考虑字母和数字字符,可以忽略字母的大小写。
示例:
12345输入: "A man, a plan, a canal: Panama"输出: true输入: "race a car"输出: false
💡 解题思路
使用双指针法...