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 修饰对象,对象创建即释放,只剩一个指针。
  • 内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用。

内存问题检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Webmin上默认状态无法正常显示 Mariadb V11.02及以上版本

OS: Armbian OS 24.5.0 Bookworm Mariadb V11.02及以上版本 Webmin&#xff1a;V2.202 非常小众的问题&#xff0c;主要是记录一下。 如题 Webmin 默认无法 Mariadb V11.02及以上版本 如果对 /etc/webmin/mysql/config 文件作相应调整就可以再现Mariadb管理界面。 路径文件&am…

Mamba模型学习笔记

笔记来源&#xff1a;bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层&#xff0c;无论是 encoder 还是 decoder&#xff0c;序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内&#xff0c;而无法直接处理窗口外的元素…

java spring定时任务-动态任务

cron表达式 在线生成https://cron.qqe2.com/ 6个时间刻度的话 * * * * * * 分别对应 秒 分 时 日 月 星期 &#xff1b; 7个时间刻度的话 * * * * * * * 分别对应 秒 分 时 日 月 星期 年&#xff1b;每隔5秒执行一次&#xff1a;*/5 * * * * ? 每隔1分钟执行一次&#xff1a…

kubectl的安装使用

1. Windows下载kubectl 2.将kucectl的所在目录添加到PATH环境变量下 3.运行 kubectl version --client 命令来测试kubectl是否正确安装并显示其版本信息。这个命令会显示kubectl客户端的版本信息&#xff0c;如果一切正常&#xff0c;这将确认kubectl已经成功安装在你的Windo…

基于SSM的汽车租赁系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

鸿蒙HarmonyOS应用开发者高级认证重点知识详解

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

骑砍模型修改逻辑

这篇博客用作日志的性质。 一&#xff0c;在自定义战场中测试自己制作好的地图 1、将制作好的地图保存到Mount & Blade II Bannerlord\Modules\SandBoxCore\SceneObj内 2、用Notepad打开 \Mount & Blade II Bannerlord\Modules\CustomBattle\ModuleData\custom_battl…

147.最小栈

题目 链接&#xff1a;leetcode链接 思路 这道题目做起来还是比较简单的&#xff0c;使用两个栈就可以实现题目要求。 其中一个栈s实现栈的基本功能&#xff0c;另一个栈mins实现检索最小元素的功能。 来看一下怎么样实现检索最小元素的功能呢&#xff1f; 我们可以这么…

希尔排序

一&#xff1a;基本思想 先选定一个整数gap&#xff0c;把待排序文件中所有记录分成个组&#xff0c;按照所有距离为整数gap的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;通过整数gap逐渐变小&#xff0c;重复上述分组和排序的工作。当整数gap…

Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列&#xff0c;每篇内容非常全面&#xff0c;包含全网各个知识点&#xff0c;非常长&#xff0c;请耐心看完。 每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么…

怎样给U盘加密?看这里!30s学会四种方法,保护你的数据安全!

在一家中型科技公司里&#xff0c;一名员工将包含重要项目资料的U盘遗忘在咖啡店的桌子上。该U盘内存有公司尚未公开的新产品设计图纸、客户信息以及财务报告等敏感数据。几小时后&#xff0c;这个未加密的U盘被一名陌生人拾到并插入其电脑中查看&#xff0c;机密信息被上传到网…

erlang学习: Mnesia Erlang数据库

创建Mnesia数据库 mnesia:create_schema([node()]).在shell里输入该行代码即可创建一个mnesia数据库于当前文件夹下 编译器文件路径下同样也有 数据库表定义创建 之后是数据库表定义&#xff0c;打开数据库创建完成后&#xff0c;启动数据库&#xff0c;添加一些表定义&…

Ubuntu22.04安装nginx

1.安装nginx 首先&#xff0c;更新你的包索引&#xff1a; sudo apt update 安装必要的软件包以允许apt通过HTTPS使用仓库&#xff1a; sudo apt install ca-certificates curl gnupg lsb-release 添加Nginx官方的GPG密钥&#xff1a; curl -fsSL https://nginx.org/keys/ng…

JavaScript练手小技巧:利用鼠标滚轮控制图片轮播

近日&#xff0c;在浏览网站的时候&#xff0c;发现了一个有意思的效果&#xff1a;一个图片轮播&#xff0c;通过上下滚动鼠标滚轮控制图片的上下切换。 于是就有了自己做一个的想法&#xff0c;顺带复习下鼠标滚轮事件。 鼠标滚轮事件&#xff0c;参考这篇文章&#xff1a;…

Vue如何将网页转换成图片或PDF并上传

一.使用html2canvas获取页面元素并绘制成图片 htmlcanvas中文文档 npm install --save html2canvas<template><div><button click"uploadImg">上传</button><div ref"yourDom"><!-- ...图片中页面内容 --><img s…

【Linux】多线程:线程互斥、互斥锁

目录 一、多线程访问公共资源时所产生的问题 二、互斥相关背景概念 互斥量mutex&#xff08;锁&#xff09;的引入 三、互斥量 1、初始化互斥量&#xff08;mutex&#xff09; 2、互斥量加锁 3、互斥量解锁 4、 销毁互斥量 四、互斥量的使用 1、使用静态互斥量 2、…

安泰功率放大器在微纳光固化3D打印中的具体应用

随着科技的进步&#xff0c;3D打印技术已经渗透到各个领域&#xff0c;尤其是微纳光固化3D打印技术。这种技术结合了光学、材料科学和微电子学的知识&#xff0c;能够制造出具有微米级精度的复杂物体。本文Aigtek安泰电子将带你探索功率放大器在微纳光固化3D打印中的应用&#…

OpenCV 之 模版匹配多个对象、图片旋转 综合应用

引言 在图像处理和计算机视觉中&#xff0c;模板匹配是一种常用的技术&#xff0c;用于在一幅较大的图像中查找与给定模板图像相似的部分。然而&#xff0c;在实际应用中&#xff0c;目标物体可能会出现在不同的角度&#xff0c;这就需要我们在匹配之前对模板进行旋转处理。本…

仿某皮影狸app官网源码 不错的APP下载官网单页源码 HTML源码

分享一款不错的APP下载官网单页源码&#xff0c;直接修改index.html即可 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89731228 更多资源下载&#xff1a;关注我。

Python(PyTorch和TensorFlow)图像分割卷积网络导图(生物医学)

&#x1f3af;要点 语义分割图像三层分割椭圆图像脑肿瘤图像分割动物图像分割皮肤病变分割多模态医学图像多尺度特征生物医学肖像多类和医学分割通用图像分割模板腹部胰腺图像分割分类注意力网络病灶边界分割气胸图像分割 Python生物医学图像卷积网络 该网络由收缩路径和扩…