- 博客(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
原创 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
原创 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初阶——线程(Part2):互斥同步问题
当多个线程并发执行,并访问同一个变量时,就会很容易发生变量的一致性问题。如图所示,假如我想让变量 a 从 100 减到 0.线程 1 在做完 a-- 操作后就被换出了:线程 1 被换出线程2被换出线程 1 执行而此时 a 这个全局变量又从 10 变成 100 了。所以,这个变量从始至终都只能被一个执行流(线程)访问。同步就是让线程按照一定顺序获取资源,而不是一窝蜂地去抢。举个例子,假如厕所是一个共享资源,一次只能一个人用。当有人进去后,就会有很多人在外面等。
2024-10-30 22:47:38
944
原创 Linux初阶——信号
当收到一个信号时,就执行信号的自定义动作。当子进程结束时,会向父进程发送 SIGCHLD (17) 信号。因此其实我们可以利用这个信号来回收子进程。
2024-10-27 07:45:42
839
原创 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)
所以,总的来说,如果我们要用智能指针的话,一般用 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
原创 C++初阶—— string
含义:从 string 的 pos 位置开始倒着查找,一旦找到字符串 s 中的任何一个字符,就返回该字符在 string 中的下标。含义:从 string 的 pos 位置开始查找,一旦找到字符串 s 中的任何一个字符,就返回该字符在 string 中的下标。含义:从 string 的 pos 位置开始,截取长度为 len 的子串给新的 string。含义:在保留原字符串的内容的同时给原字符串扩容,而且还会对扩容的部分进行初始化。含义:把整个 string 的内容删掉,变成一个空的串。
2023-07-16 22:10:22
171
原创 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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅