iOS 知识点记录
王巍
博客地址:OneV's Den
git地址:onevcat (Wei Wang) · GitHub
江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。
戴铭
博客地址:戴铭的博客
git地址:ming1016 (戴铭) · GitHub
《iOS开发高手课》和《跟戴铭学iOS编程》作者,前滴滴出行技术专家。
郭曜源
博客地址:Garan no dou | 一只魔法师的工坊
git地址:ibireme · GitHub
著名的YYKit作者,博客内容更多的是Obejctive-C相关, 其中有不少性能优化相关的,目前更新较少。
念茜
博客地址:念茜_【Android 系统与应用】,【iOS 应用程序开发】,【Qt 应用程序开发】-CSDN博客
安全大佬,博客内容包含iOS和安卓,主要是安全攻防方面,也包含一些其他技术内容。博客似乎搬家了,但没找到新的。
bang
博客地址:bang’s blog git地址:bang590 (bang) · GitHub
JSPatch作者。博客技术内容主要是Obejctive-C,目前更新也比较少。
Kenshincui
博客地址:https://www.cnblogs.com/kenshincui/
NSHipster
博客地址:NSHipster
博客内容内容较广,有Obejctive-C, Swift, CoCoa, Xcode等等。
唐巧
博客地址:唐巧的博客
git地址:tangqiaoboy (Tang Qiao) · GitHub
就职于猿辅导,首届国内Swift开发者大会的组织者。博客更新率较高,但目前比较少涉及具体的技术问题。
黄文臣
博客地址:黄文臣_iOS开发详解,iOS进阶,Swift入门教程(1.0)-CSDN博客
抖音iOS架构师, 内容涉及iOS音视频,汇编,动画等方面。
李忠
博客地址:Limboy
来自蘑菇街,RAC实践的国内先驱者。博客更新率较高,但已经比较少涉及一些具体的技术问题。
萧宸宇
博客地址:Ewan's Blog
博客中内容涉及较广,其中包含了许多iOS开发的文章。
ina
博客地址:IAN博客 | 苹果技术分享网
iOS & macOS 开发者|独立博客博主
sunny
博客地址:sunnyxx的技术博客
git地址:sunnyxx (Yuan Sun) · GitHub
博客目前已经很久不更新了,但有很多文章放到现在也值得一看。
阿毛
博客地址:https://xiangwangfeng.com/
git地址:xiangwangfeng (阿毛) · GitHub
Tualatrix Chou
博客地址:I'm TualatriX
王令天下的Blog
博客地址:码农人生
学习Flutter的同学可以关注一下。
码农人生
博客地址:码农人生
已经很久不更新,iOS音视频相关。
iOS 整体架构
iOS 整体框架及类继承框架图 - 简书
002-知识体系| iOS系统整体框架及类继承框架图-综述 - 掘金
001-知识体系|建立自己的iOS知识体系 - 掘金
Cocoa Touch Layer:
触摸层提供应用基础的关键技术支持和应用的外观。如NotificationCenter的本地通知和远程推送服务,iAd广告框架,GameKit游戏工具框架,消息UI框架,图片UI框架,地图框架,连接手表框架,UIKit框架、自动适配等等Media Layer:
媒体层提供应用中视听方面的技术,如图形图像相关的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO、QuartzCore等等。声音技术相关的CoreAudio,OpenAL,AVFoundation,视频相关的CoreMedia,Media Player框架,音视频传输的AirPlay框架等等Core Services Layer:
系统服务层提供给应用所需要的基础的系统服务。如Accounts账户框架,广告框架,数据存储框架,网络连接框架,地理位置框架,运动框架等等。这些服务中的最核心的是CoreFoundation和Foundation框架,定义了所有应用使用的数据类型。CoreFoundation是基于C的一组接口,Foundation是对CoreFoundation的OC封装Core OS Layer:
系统核心层包含大多数低级别接近硬件的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含数字信号,线性代数,图像处理的接口。针对所有的iOS设备硬件之间的差异做优化,保证写一次代码在所有iOS设备上高效运行。CoreBluetooth框架利用蓝牙和外设交互,包括扫描连接蓝牙设备,保存连接状态,断开连接,获取外设的数据或者给外设传输数据等等。Security框架提供管理证书,公钥和私钥信任策略,keychain,hash认证数字签名等等与安全相关的解决方案。
iOS UIView 和 CALayer
UIView 和 CALayer 的关系
iOS-UIView和CALayer的关系 - 简书
iOS 中 UIView 和 CALayer 的关系 - 掘金
- UIView 是UIKit 中的类,继承于UIResponse,可以响应事件。
- CALayer 是 QuartzCore 中的类,继承于NSObject,负责绘制内容、动画,不能响应事件。
CALayer anchorPoint 和 Position
了解CALayer隐式动画
响应者链机制及其应用
史上最详细的iOS之事件的传递和响应机制-原理篇 - 简书
iOS响应者链、事件的传递 - 简书
事件的传递: Hittest 和 PointInside
当一个事件发生后,事件会从父控件传给子控件,也就是说由UIApplication -> UIWindow -> UIView -> subview, 从 SubView数组最后一个开始hittest, 以上就是事件的传递,也就是寻找最合适的view的过程。
拦截事件处理
在父控件的hitTest:withEvent:中返回子控件作为最合适的view!因为hittest 是从 SubView数组最后一个开始,有可能最合适的view 比想要指定的view 后添加
事件的响应: touchsBegin
接下来是事件的响应。首先看SubView能否处理这个事件,如果不能则会将事件传递给其上级视图(SubView的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃
在事件的响应中,如果某个控件实现了touches...方法,则这个事件将由该控件来接受,如果调用了[supertouches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {if isHidden == true || alpha < 0.05 || isUserInteractionEnabled == false {return super.hitTest(point, with: event)}else{if self.point(inside: point, with: event) {return super.hitTest(point, with: event)}else{//1.有subView时交给subView 去响应for subview in self.subviews{let coverPoint = self.convert(point, to: subview)return subview.hitTest(coverPoint, with: event)}//2.没有subView时交给自己来响应,也就是说你无论在哪儿点击都会响应(扩大点击区域)//当然这里如果你想扩大到一定的返回,可以在此处加限制let isResponse:Bool = falseif isResponse {return self}else {return nil}//3.如果你不想当没有subView时就随便响应,j就返回nilreturn nil}}
}
了解UITouch 和 UIEvent
应用
1. hittest 扩大按钮点击范围: iOS 扩大UIButton的点击范围 - 简书
@implementation CustomButton- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {// 扩大点击区域的宽度和高度CGFloat expandWidth = 20.0;CGFloat expandHeight = 20.0;// 负值会让响应区域扩大CGRect largerArea = CGRectInset(self.bounds, -expandWidth, -expandHeight);// 返回点是否在扩展后的区域内return CGRectContainsPoint(largerArea, point);
}@end
2. 管理点击事件
UIResponder 的 nextResponder属性:响应链之nextResponder - 简书
动画
iOS开发系列--让你的应用“动”起来 - KenshinCui - 博客园
iOS动画-CAAnimation使用详解 - 简书
动画类型
- CALayer(bounds,position,anchorPoint,transform等)
- Core Animation(基础动画,关键帧动画,动画组,转场动画,逐帧动画)
- UIView动画封装(基础动画,关键帧动画,转场动画)
UIView封装动画存在的问题:
1:不能控制动画的暂停
2:不能进行动画的组合
。。。
这里就需要了解iOS的核心动画Core Animation(包含在Quartz Core框架中)。在iOS中核心动画分为几类:基础动画、关键帧动画、动画组、转场动画。
应用
按钮缩放、抖动动画(使用CAKeyframe实现)
iOS呼吸动画 | 迈腾大队长
https://www.cnblogs.com/sundaysgarden/articles/9252348.html
Lottie 和 PAG
从解码渲染层面对比 PAG 与 lottie - 简书
配置文件
Lottie: Json
PAG: 自研二进制文件
了解Lottie Json 文件大概内容,如何修改
性能优化
卡顿优化、内存优化、启动优化、WKWebview 启动优化、包体积优化、
CPU 占用率、使用时崩溃率、耗电量监控、流量监控、网络状况监控、等等
iOS - 性能优化 - 简书
iOS面试题:对程序性能的优化你有什么建议? - 简书
内存优化
深入探索iOS 内存优化
内存管理-内存分区
iOS 内存五大区 - 简书
- 堆区:是由程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减。
- 栈区:栈是由编译器分配和释放,用于存放程序临时创建的变量、函数的参数、局部变量等。
- 全局(静态)区:是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
static修饰的变量(全局变量)始终保存到常量区。 - 常量区:是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域。
- 代码区:用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作。
内存问题
iOS 内存优化之工具介绍 - 掘金
iOS 内存泄漏排查方法及原因分析 - 简书
- 内存泄漏:是指申请的内存空间使用完毕之后未回收,主要由循环引用引起,例如block 里引用self,delegate 没有使用weak 修饰,Timer 定时器没有 invalidate, 置为 nil
- 野指针:是指引用一个已经释放的内存空间,例如assign 修饰对象,对象创建即释放,只剩一个指针。
- 内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用。
内存问题检测
iOS 内存泄露、野指针调试技巧_weixin_30515513的博客-CSDN博客
- 野指针:选中Edit Scheme,并点击 Run -> Diagnostics -> Enable Zombie Objects 设置
完 之 后,重新运行。
- 内存泄漏:Analyzer(静态分析);MLeaksFinder (第三方工具);Instruments Leaks (动态检测);排除法
引用计数(ARC, MRC)
+1:alloc, retain, copy,mutableCopy,new
-1:release
引用计数为0,对象释放; 谁引用,谁释放
属性修饰符
IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义
MRC: assign,retain,copy
ARC: strong,weak
readwrite, nonatomic
Weak 和 Unowned
weak
- 用于避免强引用循环。
- 当引用的对象被释放后,weak引用会自动被设置为nil,避免了悬挂指针(dangling pointers)。
- 可以在声明时使用可选类型(optional)来表示weak引用,因为它可能为nil。
unowned
- 也用于避免强引用循环。
- 不会被自动设置为nil,所以在对象被释放后,如果你访问了一个unowned引用,会导致野指针(野引用)错误。
- 通常用于你确切知道引用的对象在引用生命周期内不会被释放的情况,否则会导致崩溃。
卡顿优化
卡顿原因
iOS 保持界面流畅的技巧 | Garan no dou
iOS 底层 - 性能优化之CPU、GPU - 简书
iOS 底层原理 - 性能优化 - 知乎
计算机系统中 CPU、GPU、显示器是协同工作的。CPU 计算好显示内容(如视图的创建、布局计算、图片解码、文本绘制等)提交到 GPU,由 GPU 进行变换、合成、渲染,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。
优化方案
CPU
- 耗时操作放入子线程;如图片解码、尺寸计算、文本绘制等;
- 控制线程的最大并发数量;
- 提前计算好布局,在有需要的时候一次性调整对应属性,不要多次修改;
- 尽量用轻量级的对象 如:不用处理事件的 UI 控件可以考虑使用 CALayer;
- 不要频繁地调用
UIView的相关属性 如:frame、bounds、transform 等;
GPU
相关文章:
iOS 知识点记录
王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址:戴铭的博客 git地址:ming1016 (戴铭) GitHub 《i…...
C++系列-STL中搜索相关算法
STL中search相关算法 💢search相关算法💢💢search算法举例💢💢search_n算法举例💢💢binary_search算法举例 💢 lower_bound💢 upper_bound💢 lower_bound和up…...
5.C++程序中的注释
我们来看上节所写的程序 #include <iostream> using namespace std;void prnt() //打印A {cout << "printA" << endl; }int main() {prnt();return 0; } 上面的程序中“//打印A”,表示说明当前函数是打印内容的函数,具体…...
com.kingbase8.util.KSQLException: ERROR: permission denied for table xxx
前言 在信创改造中,数据库替换为国产数据库是不可缺少的一部分。而可替换选项中多数选项无非是人大金仓和达梦数据库二选一。本文将介绍人大金仓在使用过程的问题以及解决办法。 问题 在使用人大金仓数据库后,程序运行报错 com.kingbase8.util.KSQLEx…...
开发小程序
由于之前购入的阿里云ECS放着落灰,碰巧又看到个有趣的项目,于是就做了个生成头像的小程序…由于第一次完整发布小程序,记录一下遇到的问题 小程序名称:靓仔创意头像 😂 关于小程序 接口请求,在开发过程中…...
JS考核答案
1.请简述var, let, const的区别? (1)块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题: 内层变量可能覆盖外层变量 用来计数的…...
高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)
1. 安装 npm i amap/amap-jsapi-loader --save移步:官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…...
MySQL底层为什么选择用B+树作为索引
首先,我们来想想为什么这么多数据结构,为什么要用树这种数据结构? 众多的数据结构在逻辑层面可分为:线性结构 和 非线性结构。 线性结构有:数组、链表,基于它们衍生出的有哈希表(哈希表也称散…...
MATLAB系列05:自定义函数
MATLAB系列05:自定义函数 5. 自定义函数5.1 MATLAB函数简介5.2 在MATLAB中传递变量:按值传递机制5.3 选择性参数5.4 用全局内存分享数据5.5 在函数两次调用之间本地数据的存储5.6 函数的函数(function functions)5.7 子函数和私有函数5.8 总结 5. 自定义…...
C++速通LeetCode简单第20题-多数元素
方法一:暴力解法,放multiset中排序,然后依次count统计,不满足条件的值erase清除。 class Solution { public:int majorityElement(vector<int>& nums) {int ans 0;multiset<int> s;for(int i 0;i < nums.s…...
回收站永久删除的文件还能恢复吗?教你恢复技巧
在数字时代,电脑是我们工作、学习和娱乐的重要工具。然而,随着我们对电脑的频繁使用,误删文件的情况也时有发生。当我们在回收站中不小心永久删除了某个重要文件时,内心可能会充满焦虑和疑惑:这些文件还能恢复吗&#…...
Python Web 微服务架构全面解析与实战指南
Python Web 微服务架构全面解析与实战指南 目录 🏗️ 微服务基础概念 微服务架构与单体架构的对比微服务的优点与挑战 🔄 服务间通信 使用REST、gRPC或消息队列实现服务通信API网关的使用(如Kong、Traefik) 🔍 服务…...
SEAFARING靶场漏洞攻略
寻找漏洞 一,我们打开页面 第一个漏洞 xss漏洞 1.在登录页面显示有弹窗 第二个漏洞 sql注入漏洞 1.在输入框的地方输入-1 union select 1,2,3#我们来查看他的回显点 2.查看数据库表名 -1 union select 1,database(),3# 3.查看表名 -1 union select 1,2,group…...
ROS 编程入门的介绍
2.1 创建 ROS 功能包 ROS(Robot Operating System)是一种开源的机器人软件框架,广泛用于机器人开发中。通过使用 ROS,开发者可以轻松创建和管理机器人应用程序。在本节中,我们将介绍如何创建一个 ROS 功能包并实现一些…...
第十一章 抽象类与接口
一、抽象类和抽象方法 抽象类:使用abstract修饰的类 抽象方法:在类中没有方法体的方法,称为抽象方法,抽象方法用abstract修饰 抽象类中可以没有抽象方法,包含抽象方法的类必是抽象类 如果子类没有实现父类中的全部…...
请问企业的八大金刚系统是哪些?有什么共同点和区别?
我的理解的八大金刚包括:MES、ERP、WMS、OMS、CRM、SCM、SRM、PLM。 这些系统的主要功能及运用领域是哪些方面?他们互相之前有什么区别?选择时哪些是企业可能根据自身需求选择的必选项目或可选项目? 由于某些系统的必选性取决于企业的具体业…...
【入门】配置 Java 应用程序的完整指南
前言: Java 是一种广泛使用的编程语言,具备跨平台的特性,使得其应用程序可以在多种环境中高效运行。本文将介绍如何将 Java 应用程序从开发环境部署到生产环境,确保其能够稳定、稳定地运行运行。 确定运行环境 Java程序可以运行…...
flutter widget 设置GestureDetector点击无效
有可能是被上层的widget挡住了,虽然你看得到这个widget,但是操作不到。使用相对布局Stack要特别注意,这种布局会和Android一样,先写的布局放在下层,后写的,如果范围较大的话,会盖在之前的widget…...
基于SpringBoot的在线教育平台的设计与实现
文未可获取一份本项目的java源码和数据库参考。 选题的背景与意义: 随着互联网时代信息技术的不断发展,线下已经产生了很多IT技术的培训机构,但是价格却十分昂贵并且需要人们持续不断的去具体培训地点学习,因此更需要一个课程优…...
Django_Vue3_ElementUI_Release_004_使用nginx部署
1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
