- 博客(45)
- 收藏
- 关注
原创 Python教程笔记(3)
如果不存在生效的 global 或 nonlocal 语句,则对名称的赋值总是会进入最内层作用域。删除也是如此:语句 del x 从局部作用域引用的命名空间中移除对 x 的绑定。所有引入新名称的操作都是使用局部作用域:尤其是 import 语句和函数定义会在局部作用域中绑定模块或函数名称。nonlocal 语句表明特定变量在外层作用域中,并应在外层作用域中重新绑定。作用域虽然是被静态确定的,但会被动态使用。那些外层闭包函数的作用域,包含“非局部、非全局”的名称,从最靠内层的那个作用域开始,逐层向外搜索。
2024-11-15 14:14:57
240
原创 Python教程笔记(2)
zip() 返回元组的迭代器,其中第 i 个元组包含的是每个参数迭代器的第 i 个元素。不妨换一种方式认识 zip() :它会把行变成列,把列变成行。zip() 与 * 运算符相结合可以用来拆解一个列表。的:直至迭代时才会对元素进行处理。
2024-11-14 16:07:37
769
原创 Python教程笔记(1)
函数内的第一条语句是字符串时,该字符串就是文档字符串,利用文档字符串可以自动生成在线文档或打印版文档,还可以让开发者在浏览代码时直接查阅文档。函数在 执行 时使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;引用变量时,首先,在局部符号表里查找变量,然后,是外层函数局部符号表,再是全局符号表,最后是内置名称符号表。因此,尽管可以引用全局变量和外层函数的变量,但最好不要在函数内直接赋值(除非是 global 语句定义的全局变量,或 nonlocal 语句定义的外层函数变量)。
2024-11-12 16:03:32
843
原创 ARM汇编:常见指令与函数
文章目录常用汇编指令ARM指令条件码函数ifforwhiledo...whileswitch常用汇编指令MOV X1,X0 //将寄存器X0的值传入寄存器X1ADD X0,X0, X1 //寄存器X0和X1的值相加后传入X0SUB X0,X0,X1 //相减AND X0,X0,#0xF //X0的值与0xF相位与后的值传到X0ORR X0,X0,#0xF //或EOR X0,X0,#0xF //异或LD
2021-04-02 21:59:28
2274
原创 ARM汇编:初识寄存器
文章目录CPU内存寄存器(arm)汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令。CPU地址总线:它的宽度决定CPU寻址能力,最大为2的总线宽度次方。8086宽度20,所以最大寻址为2的20次方为1M。数据总线:它的宽度决定单次数据传输量,也就是数据传输速度。8086的数据总线宽度是16,单次最大传递2个字节的数据。32位、64位Cpu指的就是数据吞吐量,64位为8字节。控制总线:它的宽度决定了CPU对其他器件的控制能力,能有多少种控制。CPU除了有控制器(控件其它器件)、运算
2021-03-31 23:25:45
2242
原创 CocoaPods私有库
文章目录概念设置私有PodDemo删除私有Repo创建概念Spec(Specification)Podspec或Spec描述了Pod库的版本,一个Pod可有多个Spec,可以通过pod spec create来创建一个桩,Podspecs是ruby文件。SubspecsSubspecs是一种切割Podspec功能的方法,允许人们安装您的库的子集。比如pod 'ShareKit'会安装整个库,而pod 'ShareKit/Facebook'可以只安装Sharekit下的Facebook子库
2021-03-11 17:04:49
429
原创 RxSwift第一篇:核心逻辑分析
文章目录创建序列订阅序列发送事件总结//序列创建let ob = Observable<Any>.create { (observer) -> Disposable in //要观察的事件 observer.onNext("abc") return Disposables.create()}//订阅序列_ = ob.subscribe(onNext: { (text) in print("订阅到了\(text)")}, onError: { (
2021-02-11 00:45:15
203
原创 macOS下Flutter开发环境搭建
文章目录使用镜像获取Flutter SDK更新环境变量升级Flutter SDKVS Code的配置与使用创建项目运行仅调试iOS使用镜像由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中:export PUB_HOSTED_URL=https://pub.flutter-io.cnexport FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn注意:
2021-01-24 16:44:03
145
原创 Python3基础语法 & 运算符
文章目录基础语法编码标识符关键字注释行与缩进多行语句标准数据类型数字类型字符串数组元组集合字典数据类型转换一行多语句模块导入运算符算术运算符关系运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级基础语法编码默认情况下,Python 3 源码文件以UTF-8编码,所有字符串都是 unicode 字符串。标识符第一个字符必须是字母表中字母或下划线_标识符的其他部分由字母、数字和下划线组成标识符对大小写敏感关键字keyword模块可输出当前版本所有关键字import key
2021-01-14 23:27:55
1426
原创 重学OC第二十六篇:RunLoop
文章目录前言一、RunLoop文档解析1.1 Modes1.2 Sources1.2.1 Input Sources1.2.2 Timer Sources1.3 Observers1.4 事件执行顺序1.5 何时使用RunLoop二、RunLoop源码解析总结前言RunLoop有一篇ibireme写的深入理解RunLoop,虽然文中RunLoop内部逻辑那张图有些许错误,但确实是一篇好文章,早年看时很多地方不太理解,但确实对我理解RunLoop有帮助。本篇主要是对官方文档和CFRunLoop源码的学习
2021-01-05 01:21:23
231
原创 重学Swift第十篇:Codable
文章目录解码JSONDecoder源码解析_JSONDecoder编码Codable可以将自身与外部表示形式(例如JSON)进行互相转换的类型。public protocol Encodable { func encode(to encoder: Encoder) throws}public protocol Decodable { init(from decoder: Decoder) throws}public typealias Codable = Decodable & En
2020-12-30 23:53:54
565
1
原创 重学Swift第五篇:Mirror源码初探
文章目录一、Swift Runtime探索二、反射三、元类型、AnyClass、Self四、错误处理一、Swift Runtime探索二、反射三、元类型、AnyClass、Self四、错误处理
2020-12-20 00:21:47
714
原创 重学Swift第四篇:指针 & 内存管理
文章目录一、RawPointer二、TypedPointer一、RawPointer二、TypedPointer
2020-12-16 19:48:44
860
原创 重学Swift第二篇:属性
文章目录前言一、存储属性1.1 延时加载存储属性二、计算属性三、类型属性四、属性观察器五、属性包装器前言属性将值与特定的类、结构体或枚举关联。存储属性会将常量和变量存储为实例的一部分,而计算属性则是直接计算(而不是存储)值。计算属性可以用于类、结构体和枚举,而存储属性只能用于类和结构体。存储属性和计算属性通常与特定类型的实例关联。但是,属性也可以直接与类型本身关联,这种属性称为类型属性。另外,还可以定义属性观察器来监控属性值的变化,以此来触发自定义的操作。属性观察器可以添加到类本身定义的存储属性上,也可
2020-12-11 23:30:42
221
原创 重学Swift第一篇:类结构探索
文章目录前言一、Swift编译过程二、SIL分析三、类结构探索总结前言内容主要是通过对Swift源码和SIL代码来学习Swift中底层的实现。一、Swift编译过程一个swift文件的编译过程如下:Swift在编译过程中使用的LLVM前端编译器是swiftc,可通过swiftc -h查看了解各命令的作用。二、SIL分析在main.swift中定义Test类class Test {}var test = Test()通过swiftc -emit-sil main.swift >&
2020-12-09 23:49:11
350
原创 Swift源码项目编译
文章目录前言一、编译环境二、编译步骤三、Ninja增量编译前言本文记录了Swift源码项目在macOS系统下的编译过程,电脑配置低,4G内存 + 128G硬盘,最后编译下来大约使用了50多G硬盘空间,耗时大概7个小时。编译过程建议学习ninja和build-script相关参数按自己所需进行配置。一、编译环境Python3:一些脚本python写的Xcode硬盘空间:源代码大约3.5G,根据构建设置不同,构建完成在5G~70G之间。CMake:CMake是用于C和C ++的跨平台构建系统N
2020-12-07 01:46:10
1012
原创 重学OC第二十四篇:启动优化
文章目录前言一、冷启动1.1 性能检测1.2 优化二、二进制重排2.1 原理2.1.1 PageFault检测2.2 重排2.2.1 二进制符号顺序查看2.2.2 通过.order文件重排2.2.3 clang插桩前言启动分为冷启动和热启动,主要区别是内存是否有APP加载的数据,如果所有的数据需从硬盘读取后加载到内存,那就为冷启动。下面主要是关于冷启动方面的优化。一、冷启动1.1 性能检测APP启动分两个阶段来测试:main函数前(pre-main)主要是dyld流程部分,包括动态库加载
2020-11-24 00:41:26
1087
原创 重学OC第二十三篇:block
文章目录一、Block是什么?1.1 __block二、Block源码分析一、Block是什么?int main(int argc, const char * argv[]) { int a = 0; void (^aBlock)(void) = ^{ NSLog(@"%d", a); }; aBlock();}用clang转为cppBlock是带有自动变量(局部变量)的匿名函数,但在OC中Block本质上就是一个对象(__main_block_impl_0结构体类比obj
2020-11-14 00:54:09
761
原创 重学OC第二十一篇:@synchronized分析
文章目录一、clang分析@synchronized二、objc_sync_enter()源码解析2.1 id2data()函数分析三、objc_sync_exit源码总结一、clang分析@synchronizedint main(int argc, const char * argv[]) { NSObject *obj = [[NSObject alloc] init]; @synchronized (obj) { } return 0;}通过clang -re
2020-11-07 22:01:44
1398
原创 重学OC第十九篇:GCD概要及API简介
文章目录一、什么是GCD?二、GCD的API1.1三、GCD实现总结一、什么是GCD?Grand Central Dispatch(GCD)是异步执行任务的技术之一。通常,应用程序中编写的线程管理用的代码要在系统级实现,开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。二、GCD的API1.1三、GCD实现总结...
2020-11-05 19:23:41
315
原创 重学OC第十八篇:进程与线程
文章目录前言一、进程内存区域分布1.1 栈溢出、栈桢二、线程2.1 线程访问权限2.2 线程调度与优先级2.3 线程池2.4 iOS线程栈大小2.5 iOS多线程技术方案总结前言先来简单了解一下进程和线程进程是一个执行中程序的实例(操作系统对一个正在运行的程序的一种抽象)。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件,而并发运行,则是是说一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。线程是进程的基本执行单元,一个进程的所有任务都在
2020-11-03 22:04:52
333
原创 2020年对iOS和Mac中OC runtime的三项改进
Advancements in the Objective-C runtime前言一、类数据结构的变化二、OC相对方法列表的变化三、Tagged Pointer格式的变化(arm64上)3.1 什么是Tagged Pointer?总结前言文章内容来自于WWDC 2020Advancements in the Objective-C runtime,主要介绍了2020年对iOS和Mac中OC runtime的三项改进。一、类数据结构的变化Objective-C运行时用于跟踪类的数据结构发生了变化。
2020-10-27 15:22:31
379
原创 重学OC第十五篇:KVC
KVCKVC简介一、键值编码基础1.1 访问对象属性1.2 访问集合属性1.3 使用集合运算符1.4 表示非对象值。1.5 属性验证(仅OC)二、KVC访问器搜索模式2.1 基础Getter(valueForKey:)2.2 基础Setter(setValue:forKey:)2.3 可变数组( mutableArrayValueForKey:)2.4 可变有序集合(mutableOrderedSetValueForKey:)2.5 可变集合(mutableSetValueForKey:)总结KVC简介
2020-10-24 14:27:05
395
原创 重学OC第十三篇:类的加载(下)
分类的加载一、分类的本质二、分类加载2.1 方式一2.2 方式二2.3 attachCategories方法源码总结一、分类的本质通过clang命令把分类的.m转为c++的.cpp可从中得出_category_t的结构体,对应于objc源码为struct category_t { const char *name; //分类名 classref_t cls; //归属的类 struct method_list_t *instanceMethods; //分类中的实
2020-10-23 19:31:32
259
原创 SwiftPM简介与使用
SPM一、什么是SPM?二、概览1. Packages(包)2. Modules(模块)3. Products(产物)4. Dependencies(依赖)使用1. 创建包1.1 创建库包1.2 创建可执行程序包总结一、什么是SPM?Swift Package Manager是用于管理源代码分发的工具,旨在简化共享代码和重用他人代码的过程。该工具直接解决了编译和链接Swift软件包,管理依赖关系,版本控制以及支持灵活的分发和协作模型的挑战。我们设计该系统的目的是使在GitHub之类的服务上共享软件包变
2020-10-11 00:15:17
1948
原创 重学OC第九篇:消息转发
文章目录前言一、查看消息转发流程方法1.1 反汇编法1.2 打印日志法二、消息转发流程及简介2.1 消息转发流程图2.2 消息转发函数2.2.1 forwardingTargetForSelector(快速转发)2.2.1.1 实例方法简介2.2.1.2 实例方法简单使用2.2.2 methodSignatureForSelector和forwardInvocation(慢速转发)2.2.2.1 实例方法简介2.2.2.2 实例方法简单使用总结前言在上一篇中, 一顿乱操作跟到了__forwarding_
2020-09-25 00:36:28
261
原创 重学OC第八篇:方法查找(下)
目录前言一、lookUpImpOrForward源码解析二、_objc_msgForward_impcache总结前言在上一篇中,当缓存中方法找不到后,会调用_lookUpImpOrForward,从注释中可以看到是调用的lookUpImpOrForward方法,可以全局搜索找,也可以跟着断点找到lookUpImpOrForward在objc-runtime-new.mm中的源码。一、lookUpImpOrForward源码解析/**标准的IMP查找。*没有LOOKUP_INITIALIZE:尝
2020-09-23 00:57:26
346
3
原创 重学OC第七篇:方法查找(上)--汇编实现
目录前言一、objc_msgSend二、objc_msgSendSuper总结前言OC的方法调用用clang转为c++后就是调用objc_msgSend,在objc源码中搜索objc_msgSend在message.h文件中只了找到声明OBJC_EXPORT voidobjc_msgSend(void /* id self, SEL op, ... */ ) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);OBJC_EXPORT voidobjc_ms
2020-09-21 00:18:17
360
原创 重学OC第六篇:类结构之cache
文章目录一、cache_t分析一、cache_t分析#if defined(__arm64__) && __LP64__#define CACHE_MASK_STORAGE CACHE_MASK_STORAGE_HIGH_16#elif defined(__arm64__) && !__LP64__#define CACHE_MASK_STORAGE CACHE_MASK_STORAGE_LOW_4#else#define CACHE_MASK_STORAGE
2020-09-18 17:31:02
225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人