思维代码 - Xcode
type: channel
link: https://www.thinkcode.cn/tag/Xcode/
items: iOS系统下的图形图像显示原理
items: Xcode启动调试App好慢，看这里

iOS系统下的图形图像显示原理
type: item
date: 2023-05-17T11:09:00+08:00
description: iOS系统下的图形图像显示原理常用框架iOS系统下通常使用UIKit、Core Animation、Core Graphics、Core Image、Core Video等框架来完成图形图像的渲染和显示：UIKit：UIKit是iOS系统中用于创建用户界面的框架。它提供了许多用于显示文本、图像、按钮等控件的类，同时也提供了一些动画效果的支持。Core Animation：CoreAnimation是一个动画框架，可以用于创建基于图层的动画。它提供了一些基本的动画类型，比如位移、旋转、缩放等，还支持复杂的动画组合和定时器功能。Core Graphics：CoreGraphics是一个2D图形框架，可以用于创建和操作图像和路径。它提供了许多绘图函数，可以用于绘制直线、矩形、椭圆、圆弧等形状，还支持颜色、渐变、图案等特效。Core Image：CoreImage是一个图像处理框架，可以用于对图像进行滤镜、色彩调整、变形等操作。它提供了多种滤镜效果，可以轻松实现图片的美化、修复等功能。Core Video：CoreVideo是一个视频处理框架，可以用于对视频进行解码、编码、渲染等操作。它提供了多种视频效果，可以用于实现视频编辑、特效制作等功能。这些框架通常被iOS开发者用来实现图形图像的渲染和显示，同时也可以用于创建各种精美的用户界面和动画效果。这些框架仍然遵循图形图像渲染pipeline的基本架构，具体的技术栈如图所示：Core Animation （核心动画）Core Animation再说说Core Animation，如果你正在编写iOS App，那么无论你是否知道，你都在使用它。Core Animation字面意思是“核心动画”，但它本质上可以理解为一个复合引擎，主要职责包含：渲染、构建和实现动画。Core Animation最核心的功能是提供给上层框架“UIKit”和“AppKit”使用的Layer对象（iOS系统对应的是CALayer），用来管理和控制屏幕上需要显示的内容（Content），这些内容被分解成独立的Layer，存储在一个叫做Layer Tree（图层树）的层级关系体系之中。于是这个Tree就形成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础。简单来说就是用户能看到的屏幕上的内容都由Layer对象进行管理。Layer对象中的Contents属性保存了由设备渲染流水线渲染好的位图Bitmap（通常也被称为 backing store），而当设备屏幕进行刷新时，会从Layer对象中读取生成好的Bitmap，进而显示到屏幕上。UIView 和 Layer在iOS开发过程中，大量使用的视图控件实际上是UIView而不是CALayer，UIView能够呈现可视化内容的原因是UIKit中的每一个UI视图内部都有一个关联的CALayer，用来呈现这些内容。从上面的层次结构图上来看，UIView处于比Core Animation更高的层级，UIView除了利用Core Animation的CALayer提供可视内容的绘制和动画（Drawing and Animation）能力外，还有其他两个功能：布局与子视图的管理（Layout and subview management）。事件处理（Event handling）。Tree在UIkit中所有的视图都从一个叫做UIVIew的基类派生而来，视图可以嵌套包含其他视图-子视图，子视图也可以再嵌套包含其他子视图，经过数层的嵌套，就形成一个由不同视图组成的层级关系树，视图树（View Tree），如下图所示。从上述描述我们知道，每一个UIView都有一个CALayer与之对应，我们把这个对应的Layer叫做UIVIew的Backing Layer。在一个视图树中，每一个View的Layer也跟其View一样组成层级关系树，这个由Layer组成的树叫做图层树（Layer Tree 或 Model Layer Tree）。View的职责之一就是创建管理这个与它对应的Layer，以确保当SubViews在视图树（View Tree）中添加或者被移除的时候，SubViews关联的Layer也同样在对应的图层树（Layer Tree）中有着相同的操作。那么为什么iOS要基于UIView和CALayer提供两个平行的层级关系呢，为什么要将 CALayer 独立出来，直接使用 UIView 统一管理不行吗？为什么不用一个统一的对象来处理所有事情呢？其实这样设计的主要原因就是为了职责分离、功能拆分，方便代码的复用。iOS和MacOS下都可以使用Core Animation框架来负责可视内容的渲染，但是两个系统交互规则不同，所以要将渲染内容和交互分开设计。所以iOS有UIKit和U…

Xcode启动调试App好慢，看这里
type: item
date: 2023-02-18T14:19:00+08:00
description: Xcode启动调试App好慢最近不小心升级了iPad设备，升级后发现每次Xcode调试运行App，都在App启动页面卡个几分钟左右，调试栏也没有调试信息，在网上找解决方法，多次尝试还是一样启动缓慢。网上的解决方法大体一致：1、到 ~/Library/Developer/Xcode/iOS DeviceSupport 删除文件夹下的所有内容。2、到Xcode里面：Window -> Devices and Simulators 进入 Devices 页面，选中对应设备右击选中 Unpair Device，解除对当前设备的信任；3、重新启动Xcode，信任设备，选择设备调试即可。但是上面的方法，在我这里是无效的，通过Google找到苹果论坛的一个帖子，好多开发者都遇到这样的问题，也有好多使用上述方法无效的。在无望之际，在帖子中看到这么一句话，移除项目所有的断点重新运行。打开我们的项目发现果然有好多断点，把断点全部删除，果真奇迹发生了，app启动后立即出现调试信息进入了首页。Remove all breakpoints and try again.如果有相同问题的小伙伴，可以到这里寻求一下安慰：https://developer.apple.com/forums/thread/123068