自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(162)
  • 资源 (1)
  • 收藏
  • 关注

原创 iOS17闪退问题 *** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloa

ios升级17以后运行闪退。报错日志为*** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410。替代方式为将UIGraphicsBeginImageContextWithOptions替换为UIGraphicsImageRenderer。查看相关api发现iOS17api已经被替代。再次运行程序正常启动。

2024-01-16 09:40:11 1010

原创 环信 CocoaPods could not find compatible versions for pod “HyphenateChat“:报错

[!] CocoaPods could not find compatible versions for pod "HyphenateChat": In snapshot (Podfile.lock): HyphenateChat (= 4.1.1) In Podfile: im_flutter_sdk (from `.symlinks/plugins/im_flutter_sdk/ios`) was resolved to 0.0.1, which depends on

2024-01-15 16:57:26 387

原创 服务器被爬虫恶意攻击怎么办?

例如,可以在页面中嵌入一些 JavaScript 代码,这些代码会检测浏览器的一些属性(如是否支持 JavaScript、是否支持 Cookie 等),如果检测到浏览器属性与正常用户不同,则 WAF 可以认为该请求来自恶意爬虫,从而拒绝该请求。例如,可以在登录表单中添加一个隐藏字段(如 CSRF Token),如果该字段的值不正确,则 WAF 可以认为该请求来自恶意爬虫,从而拒绝该请求。需要注意的是,WAF 并不能完全防止恶意爬虫攻击,因为恶意攻击者可以使用各种技术来规避 WAF 的过滤。

2023-07-26 10:07:09 1590

原创 swiftUI和swift的区别

SwiftUI是苹果公司推出的一种用于构建iOS、macOS、watchOS和tvOS应用程序界面的框架。它是基于Swift编程语言开发的,旨在简化UI开发过程并提供实时预览功能,使开发人员可以更快地构建出漂亮的应用程序界面。Swift是苹果公司推出的一种面向对象的编程语言,旨在取代Objective-C成为iOS、macOS、watchOS和tvOS平台的主要编程语言。它具有现代编程语言的特性,如类型推断、闭包、泛型和安全的空值处理等,并在性能和安全性方面进行了优化。

2023-07-06 09:14:34 2592

原创 python中,数组 nums[:] 和nums有何区别?

分配给某个变量时,该变量实际上仅仅是指向了原始列表对象的引用,因此对该变量的任何更改都会反映在原始列表对象上。给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。表示对这个列表进行切片操作,切片操作的结果是返回一个新的列表对象,其中包含了原列表中的所有元素。实际上切片是生成了一个新的拷贝。的区别在于,前者是一个指向原始列表对象的引用,而后者是一个新的、独立的列表对象。来创建一个新的列表对象,则对新列表对象的任何更改都不会影响原始列表对象。

2023-06-30 15:10:53 490

原创 php-fpm 如何进程守护,保证进程不死?

PHP-FPM 通过 master 进程管理多个 worker 进程,每个 worker 进程都是一个独立的 PHP 解析器。为了保证 PHP-FPM 进程的稳定运行,需要进行进程守护。Supervisor 是一个进程管理器,可以将 PHP-FPM 的 master 进程和所有的 worker 进程作为子进程运行,并在进程崩溃时自动重启。总之,为了保证 PHP-FPM 进程的稳定运行,需要进行进程守护。这些工具可以自动重启 PHP-FPM 进程,并监控进程的运行状态,保证进程不死。

2023-06-19 09:55:28 462

原创 iphone测试中除了appium,还有更好用的工具吗

Robot Framework支持多种脚本语言,包括Python、Java、.NET等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。SeeTest支持多种脚本语言,包括JavaScript、Python、Ruby等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。TestComplete Mobile支持多种脚本语言,包括JavaScript、Python、VBScript等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。KIF还提供了一些方便的断言和验证工具,可以提高测试效率和可靠性。

2023-06-16 09:31:06 1456

原创 nginx liunx最新版本安装flask部署

1.进入Nginx官网的资源下载页:http://nginx.org/en/download.html2.下载nginx-1.22.1.tar.gz,解压完成后会在当前目录下得到一个新的nginx文件夹4.终端进入nginx文件夹目录,执行配置命令,等待配置完成5.继续在终端执行指令,将Nightx编译安装在上一步配置的目录/usr/local/nginx-1.22.1等待安装完成。6.进入安装目录/usr/local/nginx-1.22.1下的sbin目录,执行指令./nginx。

2023-05-15 10:31:40 592 1

原创 Run Loops

但是,因为主线程启动了自己的运行循环,所以只要应用程序调用应用程序委托的applicationDidFinishLaunching:方法,您就可以开始对该线程发出调用。虽然您可以只带一个附加的计时器进入运行循环,但一旦计时器触发,它通常会失效,这将导致运行循环退出。运行循环模式是要监视的输入源和计时器的集合,以及要通知的运行循环观察器的集合。在运行循环的传递过程中,只有与该模式关联的源被监视并允许传递它们的事件。这样做时,您可以使用想要运行嵌套运行循环的任何模式,包括外部运行循环使用的模式。

2023-04-12 18:06:46 586

原创 iOS 内存管理机制与原理

sidetables可以理解为一个全局的hash数组,里面存储了sidetables类型的数据,其中长度为8或者64一个obj(oc对象)对应了一个sideTable,但是一个SideTable,会对应多个obj,因为sidetabels的数量只有8或者64个,所以有很多obj会共用一个sidetable在弱引用表中,key是对象的地址,value是weak指针地址的数组(weak_entry_t)

2023-04-07 09:01:14 1257

原创 LLVM编译流程

LLVM是构架编译器(compliter)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的便是时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由美国UIUC大学的chris Lattner博士主持开展。2006年Chris Lattner加盟Apple inc。并致力于LLVM在Apple开发体系中的应用。

2023-03-29 16:36:54 685

原创 Python-Flask 快学

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。 [1] 中文名 Flask 外文名 Flask 也被称 “microfr...

2023-03-27 11:47:15 1250 1

原创 iOS Swift之RxSwift初探

Podfile文件target中添加一下代码并pod update 、、或者手动下载拖出代码模块。例如,先通过用户名密码取得 Token 然后通过 Token 取得用户信息,你不需要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。回调也变得十分简单,错误和返回结果分离,逻辑更加清晰。例如,需要将两个网络请求合并成一个,通过Rx使得代码逻辑清晰可见。这样处理代码更加简洁。

2022-09-07 10:37:35 2529

原创 iOS RunLoop 原理和核心机制

RunLoop是维护其内部事件循环的一个对象,它在程序运行过程中重复的做着一些事情,例如接收消息、处理消息、休眠等等。所谓的事件循环,就是对事件/消息进行管理,没有消息时,休眠线程以避免资源消耗,从用户态切换到内核态。有事件/消息需要进行处理时,立即唤醒线程,回到用户态进行处理。...

2022-07-18 15:40:59 1982

原创 cocoaPods 添加成功后,导入不了头文件或者not found file 报错

cocoapods添加第三方库,并且cocoapods添加成功,但是却在任何一个文件上都导入不了头文件,而且根本没有提示,即使手动打#import "xxxx.h"也报错xxxx.h not found file , 那么 我们就在 TARGETS --> Build Settings —> User Header Search Paths 中 添加${SRCROOT} 就可以了, 若还有错 试着把上一步 ${SRCROOT} 中属性 no-recursive 改为recursive。...

2022-06-29 17:13:31 1490

原创 iOS 保持界面流畅的技巧

界面流畅度优化技巧包含卡顿检测以及原理预排版预编码解码按需加载异步渲染具体可参考学习大神的帖子iOS 保持界面流畅的技巧 | Garan no douhttps://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

2022-06-27 09:59:31 866

原创 iOS之卡顿检测

很多iOS 开发,开发过程中都会面临到解决App卡顿问题,从而也衍生出很多的方法去解决卡顿,这篇文章来描述下iOS卡顿产生的原因,以及如何进行iOS卡顿检测分析。像素是如何显示到屏幕上?从最初的电子枪显示器说起,电子枪逐行读取像素点,逐行发射到屏幕上,每当一行扫描完成,显示器会发出水平同步信号HSync;然后继续下一行,直到最后一行完成一帧的绘制,电子枪恢复到起点继续下一帧的绘制,显示器会发出一个垂直同步信号VSync。对于iOS设备,VSync信号的间隔是16.7ms,也就是1秒60帧。实际绘制过程中:1

2022-06-23 11:21:15 3130

原创 iOS之启动速度优化二进制重排和clang插装

1、点击APP图标后,内核创建APP进程2、将APP的Mach-O可执行文件mmap进虚拟内存,加载dyld程序,接下来调用_dyld_start函数开始程序的初始化3、重启手机/更新APP会先创建启动闭包,然后根据启动闭包进行相关的初始化4、将动态库mmap进虚拟内存,动态库数量太多则这里耗时会增加5、对动态库和APP的Mach-O可执行文件做bind&rebase,主要耗时在 Page In,影响 Page In 数量的是 objc 的元数据6、初始化 objc 的 runtime,如果有了闭包,由于闭

2022-06-17 18:15:01 1623 1

原创 iOS之安装包优化以及瘦身

随着业务的快速发展与持续迭代,APP的包体积也在不断增加,从之前的十几M到几十M再到上百M。安装包过大,将会影响下载转化率。google开发者大会上公布的统计数据显示:包体大小每上升 6MB,应用下载转化率就会下降 1%,而每当包体大小减少 10MB 的时候,平均下载转化率也会有 0.5-1.5% 的增长。安装包大小有下载大小和安装大小两个概念。下载大小:通过网络下载的压缩 App 大小。为了节省流量,用户下载的都是压缩包,而解压的过程也就是我们说的安装。安装大小:为 App解压后将在用户设....

2022-06-11 12:12:20 2531

原创 iOS之Block分类和使用注意事项

Block有三种类型:的三种类型.并都继承于NSBlock我们在讲的三种类型之前,先了解一下程序的内存分配情况,因为不同类型的分配的内存也不同.。在iOS中内存主要分为五大区域:栈区、堆区、静态区、常量区、代码段不同block类型的内存分配 结论: 没有访问 auto变量 的block 就是 __NSGlobalBlock...

2022-06-04 17:12:51 2477

原创 iOS常用的几种锁详解以及用法

两种锁的加锁原理特殊的互斥锁,加了递归功能ios中常见的几种锁包括OSSpinLock、信号量(Semaphore)、pthread_mutex、NSLock、NSCondition、NSConditionLock、pthread_mutex(recursive)、NSRecursiveLock、synchronized如下所示,测试锁性能的案例图(实际可能会略有偏差): 由于OSSpinLock目前已经不再安全,存在bug,官方已放弃,iOS10之后os_unfair_lock取代OSSpinLock。基

2022-06-02 13:29:24 3361

原创 iOS多线程之GCD

GCD(Grand Central Dispatch),是有Apple公司开发的一个多核编程的解决方案,用以优化应用程序支持多核处理器,是基于线程模式之上执行并发任务。GCD的优点1.利用设备多核进行并行运算2.GCD自动充分使用设备的CPU内核3.GCD自动管理线程的生命周期(线程创建、线程调度、线程销毁)4.使用简单GCD任务和队列任务:就是执行操作,即可以执行的代码;执行任务有两种方式:同步 和 异步。同步(sync):阻塞线程: 同步添加任务到指定的队列中,

2022-05-31 17:32:57 2931

原创 iOS调试之LLDB命令

前言在iOSAPP开发中,我们的代码经常需要调试跟踪,最常用的是LLDB Debugger程序调试器,LLDB Debugger (LLDB) 是一个开源、底层调试器(low level debugger),具有REPL (Read-Eval-Print Loop,交互式解释器)、C++和Python插件,可以在terminal中使用。具有流向控制 (flow control) 和数据检查 (data inspection) 功能。常用LLDB命令简单操作P和PO命令p 命令:

2022-05-24 10:55:21 2549

原创 iOS 程序启动dyld加载流程

当 App 中的业务模块越来越多、越来越复杂,集成了更多的三方库,App 启动也会越来越慢,因此我们希望能在业务扩张的同时,保持较优的启动速度,给用户带来良好的使用体验。热启动与冷启动当用户按下 home 键,iOS App 不会立刻被 kill,而是存活一段时间,这段时间里用户再打开 App,App 基本上不需要做什么,就能还原到退到后台前的状态。我们把 App 进程还在系统中,无需开启新进程的启动过程称为热启动。而冷启动则是指 App 不在系统进程中,比如设备重启后,或是手动杀死 App .

2022-05-18 21:42:42 2062

原创 iOS 消息转发(Message Forwarding)

Objective-C是动态语言,方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector)。objc向对象发送消息时,runtime会根据isa指针找到对象所属类,从该类及父类方法列表寻找方法运行 如果没有找到便会抛出异常 unrecognized selector sent to xxx, 但是在这之前有三次拯救机会。1.Method resolution 方法解析处理阶段如果调用了方法 首先会调用+(BOOL)resolveInstanceMetho

2022-05-11 19:46:06 3202

原创 iOS msgSend消息发送流程

objc_msgSend在iOS中调用方法其实就是在给对象发送某条消息。消息的发送在编译的时候编译器就会把方法转 换为objc_msgSend这个函数。objc_msgSend有俩个隐式的参数,消息的接收者和消息的方法 名。objc_msgSend这个函数就能够通过这俩个隐式的参数去找到方法具体的实现。如果消息的接 收者是实例对象,isa就指向类对象,后再通过第二个参数方法名,去类对象里面找对应的方法实 现。如果消息的接收者是类对象,isa就指向元类,就会去元类里面找对应的方法实现。通过 clang

2022-05-10 20:20:55 2568

原创 iOS之Runtime Api接口大全

Runtime介绍Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象、进行消息传递和转发。理解 Objective-C 的 Runtime 机制可以帮我们更好的了解这个语言,适当的时候还能对语言进行扩展,从系统层面

2022-04-25 19:53:54 4486

原创 iOS类的本质与底层探索

前言首先,我们看下几个类型:NSObject、Class、objc_object、objc_class、id的联系与区别。NSObject:OC中的基类,绝大多数类都继承NSObject(NSProxy也是基类哦~) Class:NSObject的类型,在objc源码的NSObject.mm文件中可以看到 + (Class)class { return self;} objc_object:NSObject类在C++的底层实现的结构体名称,在生成的cpp文件中可以看到,它和N

2022-04-24 16:28:48 3604

原创 62、Flutter插件通信iOS,Android实现过程<二>

前言61、Flutter插件通信原理<一>_风雨「83」的博客-CSDN博客Flutter与原生通讯 - Flutter Plugin - 知乎前言Flutter优势主要体现在UI上--高性能且跨平台表现一致。但是针对平台(Android、IOS)的实现,如:获取电量、判断WiFi使用、调起WebView加载网页等,得调用特定平台的API包。Flutter Plugin就是为调用平台API而生。下文中所提及到的"平台"指的是Android、IOS两端。介绍Flutter Plugin包含针对Androi

2022-04-19 17:22:04 4430

原创 iOS对象alloc流程和内存对齐

在探索OC对象底层本质之前,先了解一下clangClangclang是⼀个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器 主要用于底层编译,将oc文件转换成c++文件,方便理解底层原理OC是面向对象的语言,开发中一切的基础,首先需要一个对象,如果没有的话,可以alloc一个。本篇文章主要探索alloc的内部执行流程。首先自定义Person继承与NSObject//创建对象 Person *person = [[Person alloc] init];

2022-04-18 16:11:30 3623

原创 61、Flutter插件通信原理<一>

Flutter与原生通讯 - Flutter Plugin - 知乎前言Flutter优势主要体现在UI上--高性能且跨平台表现一致。但是针对平台(Android、IOS)的实现,如:获取电量、判断WiFi使用、调起WebView加载网页等,得调用特定平台的API包。Flutter Plugin就是为调用平台API而生。下文中所提及到的"平台"指的是Android、IOS两端。介绍Flutter Plugin包含针对Android(Java或Kotlin代码)或iOS(Objecti

2022-04-12 08:19:16 3719

原创 AutoreleasePoolPage自动释放池原理

所有app的入口都是一个main函数int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}可以发现:整个 iOS 的应用都是包含在一个自动释放池 block 中的@autoreleasepool{} 本质上是一个结构体:struct .

2022-03-04 16:15:27 7398

原创 60、Flutter核心原理--绘制Compositing

本节我们来介绍一下 flushCompositingBits()。现在,我们再来回顾一下Flutter的渲染管线:void drawFrame(){ pipelineOwner.flushLayout(); pipelineOwner.flushCompositingBits(); pipelineOwner.flushPaint(); renderView.compositeFrame() ...//省略 } 其中只有 flushCompositingBits() 还没

2022-02-24 08:55:53 11214

原创 59、Flutter核心原理--组件树绘制流程

绘制相关实现在渲染对象 RenderObject 中,RenderObject 中和绘制相关的主要属性有:layer isRepaintBoundary(类型bool) needsCompositing (类型bool)RepaintBoundaryFlutter 自带了一个 RepaintBoundary 组件,它的功能其实就是向组件树中插入一个绘制边界节点。组件树绘制流程我们先讲一下Flutter绘制组件树的一般流程,注意,并非完整流程,因为我们暂时会忽略子树中需要“层合成”(

2022-02-21 17:19:48 11222

原创 58、Flutter核心原理--绘制原理及Layer

Flutter 绘制原理Flutter中和绘制相关的对象有三个,分别是Canvas、Layer 和 Scene:Canvas:封装了Flutter Skia各种绘制指令,比如画线、画圆、画矩形等指令。 Layer:分为容器类和绘制类两种;暂时可以理解为是绘制产物的载体,比如调用 Canvas 的绘制 API 后,相应的绘制产物被保存在 PictureLayer.picture 对象中。 Scene:屏幕上将要要显示的元素。在上屏前,我们需要将Layer中保存的绘制产物关联到 Scene 上。F

2022-02-18 16:37:52 10243

原创 57、Flutter核心原理--布局Layout过程

布局(Layout)过程Layout(布局)过程主要是确定每一个组件的布局信息(大小和位置),Flutter 的布局过程如下:父节点向子节点传递约束(constraints)信息,限制子节点的最大和最小宽高。 子节点根据约束信息确定自己的大小(size)。 父节点根据特定布局规则(不同布局组件会有不同的布局算法)确定每一个子节点在父节点布局空间中的位置,用偏移 offset 表示。 递归整个过程,确定出每一个节点的位置的大小和位置。可以看到,组件的大小是由自身决定的,而组件的位置是由父组件决

2022-02-16 11:29:43 10848

原创 56、Flutter核心原理--Flutter启动流程和渲染管线

启动Flutter的入口在"lib/main.dart"的main()函数中,它是Dart应用程序的起点。在Flutter应用中,main()函数最简单的实现如下:void main() => runApp(MyApp());可以看main()函数只调用了一个runApp()方法,我们看看runApp()方法中都做了什么:void runApp(Widget app) { WidgetsFlutterBinding.ensureInitialized() ..attac

2022-02-15 11:20:19 10411

原创 55、Flutter核心原理--Element、BuildContext和RenderObject

Element我们知道最终的UI树其实是由一个个独立的Element节点构成。组件最终的Layout、渲染都是通过RenderObject来完成的,从创建到渲染的大体流程是:根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最后再通过RenderObject来完成布局排列和绘制。Element就是Widget在UI树具体位置的一个实例化对象,大多数Element只有唯一的renderObject,但还有一些Element

2022-02-14 09:12:04 10308

原创 54、Flutter核心原理--Flutter UI 框架(Framework)

Flutter 从上到下分为框架层、引擎层和嵌入层三层。开发者基本上都是与框架层打交道。术语UI框架(UI Framework)特指:基于一个平台,在此平台上实现一个能快速开发GUI(图形用户接口)的框架,这里的平台特指操作系统,如Android、iOS或者Windows、macOS。通常来讲平台提供的都是图形 API 都非常的基础,通常就是一个和 Canvas 差不多基础的绘制接口,如果没有UI 框架的封装,可以想象一下,如果没有UI框架的封装,直接用 Canvas 来构建用户界面将会是怎样的一个体验

2022-02-10 21:25:24 12202

原创 53、Flutter之通知 Notification

通知(Notification)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知。Flutter中将这种由子向父的传递通知的机制称为通知冒泡(Notification Bubbling)。通知冒泡和用户触摸事件冒泡是相似的,但有一点不同:通知冒泡可以中止,但用户触摸事件不行。Flutter中很多地方使用了通知,如前面介绍的 Scrollable 组件,它在滑动时就会分发滚动通

2022-02-10 08:35:07 14413

Scrapy分布式原理.key

分布式爬虫架构,Scrapy分布式原理.scrapy,redis在每台从机Scrapy启动时都会首先判断当前Redis Request队列是否为空。 如果不为空,则从队列中取得下一个Request执行爬取。 如果为空,则重新开始爬取,第一台从机执行爬取向队列中添加Request。

2020-04-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除