自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 Swift 初阶 —— Sendable 协议 & data races

摘要:本文详细介绍了Swift并发编程中的关键概念。首先解释了数据竞争(dataraces)的定义和产生原因,即多线程未同步访问共享可变变量,并通过计数器示例展示了具体表现。其次阐述了并发域(concurrencydomain)的概念及其跨域传递方式。然后讲解了Sendable协议的用途,它确保线程安全的数据传输,并说明自动遵循条件。最后介绍了@sendable修饰闭包的作用和两种阻止隐式推理协议的方法。文章结合官方文档和实际代码示例,全面覆盖了Swift并发编程中的核心安全机制。

2025-11-13 20:26:55 705

原创 Objective-C 初阶 —— __bridge & __bridge_retained & __bridge_transfer

本文介绍了ARC(自动引用计数)与MRC(手动引用计数)的概念,以及三种桥接方式(__bridge、__bridge_retained、__bridge_transfer)的使用场景和引用计数变化。ARC自动管理引用计数,而MRC需手动调用retain/release。__bridge仅进行类型转换,不改变引用计数;__bridge_retained会增加MRC侧引用计数;__bridge_transfer会将MRC引用计数转移至ARC侧。文章通过代码示例直观展示了不同桥接方式下引用计数的变化情况,帮助开发

2025-10-26 22:08:04 490

原创 Swift 初阶 —— inout 参数 & 独占访问问题 (Exclusive access)

Swift中的inout参数遵循"独占访问"原则,防止对值类型变量的并发修改。当值类型变量作为inout或mutating参数传入时,函数体内不能通过其他方式重复访问该变量。引用类型不受此限制,因为其属性访问被视为独立内存操作。编译器对struct属性访问有优化,允许同一语句访问不相交属性。常见错误包括多个inout参数冲突和闭包捕获导致的访问重叠。在mutating方法中使用逃逸闭包时,需注意避免野指针问题,可通过捕获列表创建只读副本解决。这些规则确保了Swift内存访问的安全性。

2025-10-24 04:18:32 906

原创 网络初阶——运输层:TCP 协议(Part1)

摘要:本文详细解析了TCP协议的核心机制,包括全双工通信原理、面向字节流特性引发的粘包问题及解决方案、TCP报文首部结构、关键策略(确认应答、超时重传、三次握手/四次挥手)以及流量控制和拥塞控制算法。重点阐述了滑动窗口机制的工作原理,分析了TCP连接状态转换中的全连接队列和半连接队列管理,并解释了TIME_WAIT状态存在的必要性及其持续时间设置原理。全文通过具体示例和图示,系统性地揭示了TCP协议如何实现可靠传输与高效通信的底层机制。

2025-10-03 01:33:07 1180

原创 Objective-C —— APIs declaration 自定义

NS_REFINED_FOR_SWIFT 是把 Objective-C API 在导入到 swift 时,重命名成在第一个标签前加 _ _ 的函数——表示不建议 swift 侧直接调用. 然后你就可以在 swift 侧用 swift extension 里写一个更 Swifty 的替代方案.举个例子:__initWithCString(_:freeWhenDone:) // 有双下划线,不建议直接在类外调。

2025-09-19 19:37:42 1492 1

原创 Whistle 使用(进阶)

【代码】Whistle 使用(进阶)

2025-08-16 05:12:11 214

原创 iOS 抓包——whistle 抓包配置

一、whistle 的基本用途一、whistle 的基本用途简单来说whistle就是一个用来做网络抓包的工具可以把客户端和mac端的所有网络请求拦截。所以作为客户端开发者我们可以利用whistle来熟悉项目的网络请求部分是怎么写的;而且还能通过whistle来找到一个数据如主播信息粉丝信息……的结构体是如何定义以及它是通过。

2025-08-11 01:59:42 1288

原创 关于 Cocoapods 使用

podspec 的全写就是 pod specification,就是 pod 说明书。所以从后缀名就可以看出,.podspec 文件就是用来描述一个第三方库的基本信息的;或者说 .podspec 文件存的是这个第三方库除源代码以外的信息(比如这个库的作者、库的版本、库的源代码的仓库地址、库所支持的 swift 版本……)。以下图 PrivateMath 这个第三方库的 .podspec 文件举例:这个库的名字是 PrivateMath。

2025-08-08 02:44:36 1159

原创 Git 进阶使用

如果某一行在两个分支中都被→ 冲突,

2025-08-01 19:11:11 1249

原创 Objective-c 初阶——异常处理(try-catch)

所以 32 位下 oc 的 try 比 64 的 try 性能消耗更大是因为 32 位下 oc 会给每一个 try 块创建一个叫 jmp_buf env 的东西,而且还会调一次 setjmp();那 64 位的 throw 比 32 位的 throw 性能更差是因为 32 位下用的是 exception frame + longjmp() 来跳转,每一跳肯定可以跳到最近有 catch 的函数栈帧中,所以 32 位找对应 catch 所花的时间是比 64 位一个一个栈帧找要快的。先提前下个结论:根据。

2025-07-29 17:04:03 1753 1

原创 Objective-c 初阶 —— Runtime(方法交换 & 消息传递)

selector 就是一个函数区分器。它只会给这个方法名一个唯一的哈希值。也就是说,如果只要两个函数的方法名是一样的,那么他们的 selector 的哈希值就是一样的。每个对象都有一个 isa 指针。实例对象的 isa 指针指向的是该实例所属的类对象,而类对象的 isa 指针指向元类对象。那么如何区分类对象和元类对象呢?类对象存的是实例方法,不存类方法,而元类存的是类方法。消息转发就是当 runtime 在继承链中找不到 selector 对应的函数实现后,就会进行消息转发,即用其他对象来调这个方法。

2025-07-14 03:16:06 1789

原创 Swift 与 Objective-c 混编 & 桥接配置

1. command + N 新建文件,选 Cocoa Class2. 创建桥接文件3. 在桥接文件里 import 要暴露给 swift 的 oc 头文件4. 在要暴露给 swift 的 oc 文件 import {target}-Bridging-Header.h。

2025-07-13 13:39:15 629

原创 创建 UIKit 项目教程

八、在 building settings 里搜 storyboard,然后把 UIKit Main Storyboard File Base Name 的 "Main" 置空。六、在 AppDelegate.swift 文件里的 application 函数改成这样。七、删掉在 Info.plist 的 Application Scene Manifest。一、打开 XCode,选择 iOS 下的 App,然后点 Next。四、删掉 SceneDelegate.swift。

2025-07-12 23:58:19 476

原创 Swift —— delegate 设计模式

所谓 delegate 就是代理模式。简单来说,delegate 模式就是在类的函数里运行完一段代码后,你可以通过一个符合某个代理协议的属性来调代理的方法。其中,代理方法就是回调函数。

2025-04-15 23:34:16 506

原创 SwiftUI 初阶——显式 animation & 隐式 animation

调用 .animation 修饰符就是隐式 animation。注:.animation() 只会给在它之前的修饰器的变化添加动画过渡,并不会给在它之后的修饰器的变化添加动画过渡!

2025-03-26 12:06:37 382

原创 网络初阶——高效IO & 多路转接

一个进程,但管理着多个文件描述符。利用多个文件描述符读写数据。参数介绍size:该参数已经被废弃了,传一个大于 0 的数进去就行了。返回值:成功时,返回 epoll 模型的 fd;失败返回 -1.

2024-11-18 11:30:50 1005

原创 网络初阶——运输层:TCP 协议(Part2)

所以从上图可以看出,文件描述符是可以通过多个箭头来访问 socket 和报文的。而且,其中 struct udp_socket 和 struct tcp_socket 相当于继承了基类 struct socket ,同时 struct proto_ops 和 file_operations 表面上看只是存函数指针的,但其实就是 C 语言版的多态。

2024-11-14 21:21:50 564

原创 网络初阶——应用层:HTTPS 协议

从协议的名字来看,HTTP 比 HTTPS 少了一个 S。而这个 “S”,其实可以理解成 “Safe”,所以不难看出,其实 HTTPS 就是 HTTP 的安全版。就是为了保证客户端 cookie 的传输安全的。

2024-11-10 16:44:38 1187

原创 Linux初阶——线程(Part3):POSIX 信号量 & CP 模型变体

只能建立一个对象的设计模式。

2024-11-02 14:00:54 602

原创 Linux初阶——线程(Part2):互斥同步问题

当多个线程并发执行,并访问同一个变量时,就会很容易发生变量的一致性问题。如图所示,假如我想让变量 a 从 100 减到 0.线程 1 在做完 a-- 操作后就被换出了:线程 1 被换出线程2被换出线程 1 执行而此时 a 这个全局变量又从 10 变成 100 了。所以,这个变量从始至终都只能被一个执行流(线程)访问。同步就是让线程按照一定顺序获取资源,而不是一窝蜂地去抢。举个例子,假如厕所是一个共享资源,一次只能一个人用。当有人进去后,就会有很多人在外面等。

2024-10-30 22:47:38 944

原创 Linux初阶——线程(Part1)

说到线程,那么我们就要回到进程了。

2024-10-29 13:35:51 761

原创 Linux初阶——信号

当收到一个信号时,就执行信号的自定义动作。当子进程结束时,会向父进程发送 SIGCHLD (17) 信号。因此其实我们可以利用这个信号来回收子进程。

2024-10-27 07:45:42 839

原创 MySQL 初阶——多版本控制 MVCC

版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。

2024-10-21 16:54:12 667

原创 MySQL初阶——隔离级别之Read view

当运行 select 查询语句时,才会触发快照,创建 read view 对象,把此时正在处理(未提交)的事务的 ID 都记下来,以便于后面查询时可以控制该读哪些事务的记录,不该读哪些事务的记录。

2024-10-21 15:22:57 678

原创 Linux初阶——动静态库

由于共享区可能有多个动态库,因此动态库的起始地址是不确定的,因此如果一个动态库的代码载入共享区,那么这些代码一定不会用绝对地址来编址。取而代之的是,动态库的代码会采用相对地址编址,然后再加上载入共享区后获得的绝对起始地址(设起始地址的值为 start),那么进程可以通过 start + 相对地址 的方式访问该动态库的代码。而对于进程地址空间,动态库的代码也会载入进程地址空间的共享区;在程序运行时会把代码(函数的实现)加载进内存中,然后再调整页表的映射关系,使其虚拟地址在进程地址空间的共享区中。

2024-10-12 20:42:47 723 1

原创 C++进阶——C++11(右值引用)

移动语义其实就是把两个对象之间的内容进行交换,来减少拷贝次数的原理。

2024-02-10 23:54:04 492

原创 C++进阶——智能指针(C++11)

所以,总的来说,如果我们要用智能指针的话,一般用 shared_ptr 和 weak_ptr 搭配用就可以解决程序因为抛异常而导致执行流乱跳,进而造成内存泄漏等问题了。

2024-01-26 21:56:30 1840

原创 C++进阶——C++11(lambda表达式、包装器、绑定)

lambda 表达式的语法是这样的:[capture-list] (parameters) mutable -> return-type { statement }。而且,lambda 表达式听起来是一个表达式而已,但其实是一个函数对象,而且其类型超级复杂,因此我们可以用 auto 来初始化 lambda 表达式。

2024-01-22 20:16:18 604

原创 C++进阶——C++11(part 1)

所以像 { 10, 20, 30 } 这种用大括号括起来的列表就是初始化列表。在 C++11 中,支持了用列表初始化来构造容器,因此我们都可以用 “{ }” 来进行初始化容器。

2024-01-21 22:33:29 401

原创 C++进阶——多态

被 virtual 修饰的成员函数就是虚函数。但要注意的是,虚函数的 virtual 跟继承里的 virtual 是任何没关系的。派生类只是把从基类继承下来的函数隐藏了,但派生类里依旧存在从基类继承下来的函数(只是表面上看不见而已),并且派生类里是可以访问到从基类继承下来的函数的(只不过访问时要指定类域而已)。

2024-01-21 19:39:42 594

原创 C++进阶——继承

继承就是一种类与类之间的一种关系。举个例子,如果 A 继承了 B ,那么 B 就拥有了 A 的所有成员(包括成员变量,成员函数)的拷贝,而且还可以在 A 的基础上添加新的东西(比如新的成员变量或函数)。

2024-01-11 16:08:56 875

原创 C++进阶——模板进阶

当类模板的函数声明和类模板的函数定义分开两个文件写时,编译器就会分离编译。private:// .h 文件public:void pop();private:// .cpp 文件// 显示实力化templatetemplate。

2024-01-02 19:30:35 683

原创 STL初阶——vector丐版模拟实现

【代码】C++初阶——vector丐版模拟实现。

2023-07-28 23:29:56 157

原创 STL初阶——vector

迭代器失效就是用来遍历数组的指针变为野指针,无法访问数组的情况。迭代器失效问题一般出现在需要数组扩容的时候。

2023-07-28 23:29:22 163

原创 C++初阶——string丐版模拟实现

注意,_size是有效字符的个数,因此算总个数时也要把 ‘\0’ 算进去,因此要 _size + 1。

2023-07-19 20:44:56 186

原创 C++初阶—— string

含义:从 string 的 pos 位置开始倒着查找,一旦找到字符串 s 中的任何一个字符,就返回该字符在 string 中的下标。含义:从 string 的 pos 位置开始查找,一旦找到字符串 s 中的任何一个字符,就返回该字符在 string 中的下标。含义:从 string 的 pos 位置开始,截取长度为 len 的子串给新的 string。含义:在保留原字符串的内容的同时给原字符串扩容,而且还会对扩容的部分进行初始化。含义:把整个 string 的内容删掉,变成一个空的串。

2023-07-16 22:10:22 171

原创 C++初阶——模板

简单来说,其实就是把函数形参的模板类型名变成一个具体的类型,让编译器知道应该把函数模板转换成哪种类型的函数。

2023-06-01 22:07:02 217

原创 C++初阶——动态内存管理

new -> operator new -> malloc(构造函数里);delete -> free(析构函数里) -> operrator delete。

2023-05-21 22:05:00 170

原创 C++初阶——类和对象(Part6):友元 & 内部类

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的 类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。因此,我们可以这样理解:内部类是外部类的友元。class Apublic:class B /* B里可直接访问A的所有成员,但A不能不能访问B */public:private:int _c;int _d;int _b;

2023-05-19 15:17:35 203

原创 C++初阶——类和对象(Part5):初始化列表 + static成员

初始化列表是一个类成员初始化的地方,也是构造函数的一部分,它位于构造函数的形参表和函数体之间;它以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。int* _pi;char _ch;

2023-05-12 18:32:35 319

writing running and fixing codes.one

writing running and fixing codes.one

2022-11-17

空空如也

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

TA关注的人

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