自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 多线程之GCD(上)

多线程之GCD(上)进程和线程GCD源码解析GCD进程和线程什么进程呢?进程是指在系统中正在运行的一个应用程序,也就是我们开发的每一个APP。每个进程之间是独立的,并且每个进程均运行在其专用的且受保护的内存空间内。通过“活动监视器”可以查看 Mac 系统中所开启的进程。那什么事线程呢?线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。进程要想执行任务,必须得有线程,进程至少要有一条线程。程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程。进程和线程有什么关系呢?一个线程可以

2022-05-30 15:42:11 348

原创 objc_msgSend探究

objc_msgSend探究objc_msgSend的引入self和super方法的快速查找方法的慢速查找objc_msgSend的引入首先还是从代码开始说起:LLPerson *p = [LLPerson alloc];[p test];[p test1:@"LL"];我们通过命令行clang -rewrite-objc main.m去编译main.m文件,得到main.cpp文件,在main.cpp文件中,我们查找main函数。int main(int argc, const char

2022-05-24 01:01:00 502

原创 方法缓存cache_t

方法缓存cache_tcache_t的结构cache_t的insert初始化和扩容真正的插入操作bucket_t和bucketscache_t的结构前面我们探究了class_data_bits_t,接下来我们探究cache_t这个结构,作为方法缓存,它的结构是什么样的呢?插入方式是什么样的呢?我们从源码看一下它的结构:// objc-runtime-new.h// returns: //如果没有缓存值,则缓存的IMP为nil,如果没有缓存值且缓存已预优化,则缓存为动态' value_on_const

2022-05-19 22:46:11 443

原创 类的底层探索(下)

类的底层探索(下)类中的成员变量rw ro rwe类中的成员变量从前面的分析中我们知道,我们在rw中读取到了方法列表、属性列表、协议列表,那成员变量呢?它在什么位置?在class_rw_t结构中有:// objc-runtime-new.h// 获取roconst class_ro_t *ro() const { auto v = get_ro_or_rwe(); if (slowpath(v.is<class_rw_ext_t *>())) { return v.get&l

2022-05-16 15:48:37 173

原创 类的底层探索(上)

类的底层探索(上)isa的走向首先从一张图开始说起,这样图是isa和superclass的走向图,那真的是这么走的吗?我们就通过代码,来看一下。isa的走向@interface LLPerson : NSObject@end@interface LLTeacher : LLPerson@end首先我们创建两个类,LLPerson继承自NSObject,LLTeacher继承自LLPerson。...

2022-05-15 01:35:24 306

原创 对象的底层探索(下)

对象的底层探索(下)影响对象内存的因素对象是怎么关联类型的?影响对象内存的因素从原来的分析我们得出,对象的本质是isa + 成员变量的值,那什么因素会影响对象的内存呢?我们先从一段代码开始:@interface LLPerson : NSObject// isa --- 8@property (nonatomic, strong) NSString *name; // 8@property (nonatomic, strong) NSString *hobby; // 8@property

2022-05-11 17:29:58 189

原创 对象的底层探索(上)

// objc-runtime-new.mm/************************************************************************ fixupMessageRef* Repairs an old vtable dispatch call site. 修复一个旧的vtable调度调用站点* vtable dispatch itself is not supported. Vtable调度本身不支持***************

2022-05-11 11:34:51 150

原创 Swift 类似HandyJSON解析Struct

Swift 类似HandyJSON解析StructHandyJSON从源码解析Struct获取TargetStructMetadata获取TargetStructDescriptor实现TargetRelativeDirectPointerFieldDescriptor和FieldRecordfieldOffsetVectorOffset计算偏移量代码的验证HandyJSONHandyJSON是阿里开发的一个在swift上把JSON数据转化为对应model的框架。与其他流行的Swift JSON库相比,

2022-01-13 00:22:42 2214

原创 Swift的指针和内存管理

Swift的指针和内存管理指针为什么指针不安全指针类型原生指针的使用泛型指针的使用指针读取macho中的属性名称内存绑定内存管理强引用弱引用Unowned打印Vtable指针为什么指针不安全⽐如我们在创建⼀个对象的时候,是需要在堆分配内存空间的。但是这个内存空间的声明周期是有限的,也就意味着如果我们使⽤指针指向这块内容空间,如果当前内存空间的⽣命周期到了(引⽤计数为0),那么我们当前的指针是不是就变成了未定义的⾏为了。我们创建的内存空间是有边界的,⽐如我们创建⼀个⼤⼩为10的数组,这个时候我们通过

2022-01-10 00:45:37 1832

原创 Swift中的类和结构体(2)

Swift中的类和结构体(2)异变方法方法调度异变方法在Swift中,值类型属性不能被自身的实例方法修改,编译器不会通过编译,报错Left side of mutating operator isn't mutable: 'self' is immutable,自身是不能修改自身的。当加上mutating关键字后就可以通过编译struct LLPerson { var x = 0.0 var y = 0.0 //方法默认会有self参数,类似于OC中方法会有self和_cm

2021-12-30 00:22:34 1315

原创 Swift中的类和结构体(1)

Swift中的类和结构体类和结构体的比较类的初始化器类的生命周期类和结构体的比较swift中的类:class LLPerson { var age: Int var name: String init(_ age: Int, _ name: String) { self.age = age self.name = name }}var person = LLPerson(18, "LL")var person1 = pe

2021-12-26 21:00:08 1286

原创 OC类原理

OC类原理指针拷贝普通指针 - 值拷贝对象 - 指针拷贝数组指针for (int i = 0; i < 4; i++) { int value = *(d + i); NSLog(@"%d", value);}类的结构编译后的代码源码定义 typedef struct objc_class *Class;继承自struct objc_class : objc_objectobjc_object结构(结构体写法):NSObject结构(OC写法):

2021-01-18 23:17:26 113

原创 OC对象原理

OC对象原理 LLPerson *p1 = [LLPerson alloc]; LLPerson *p2 = [p1 init]; LLPerson *p3 = [p1 init]; NSLog(@"%@ - %p", p1, &p1); NSLog(@"%@ - %p", p2, &p2); NSLog(@"%@ - %p", p3, &p3);alloc 已经创建了对象 initalloc 实现 - 原理 - 源码

2021-01-15 00:15:46 110

原创 KMP

字符串匹配---KMP暴力破解KMP暴力破解当t="abcabcd",p="bcd"时 it: a b c a b c ds: b c d j不匹配进行下一位 it: a b c a b c ds: b c d j 匹配再进行下一位 it: a b c a b c ds: b c d j i...

2018-12-24 15:33:26 113

原创 LRU算法

LRU算法LRU实现LRULRULeast Recently Used 最近最久未使用LRU的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。实现LRU用数组来存储数据,给每一个数据项标记一个访问时间戳,每次插入新数据项的时候,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项的时候,讲被访问的数据...

2018-12-11 16:05:27 615

原创 SDWebImage(4.0)

SDWebImage 4.0流程(以UIImageView+WebCache为例)UIImage+WebCacheUIView+WebCacheUIView+WebCacheOperationSDWebImageManagerSDImageCacheSDWebImageDownloader一些问题流程(以UIImageView+WebCache为例)UIImage+WebCache这个分类只...

2018-11-14 16:50:24 367

原创 Runtime

Runtime概述Runtime消息传递一些概念Runtime消息转发Runtime应用概述Runtime的特征主要是消息(方法)传递,如果消息在对象中找不到,就进行转发它是OC面向对象和动态机制的基石OC是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象,进行消息传递和转发Runtime消息传递一个对象的方法像这样[obj method],编译器会...

2018-11-07 19:49:59 183

原创 堆排序

void heapAdjust(int k[], int s, int n) { int i, temp; temp = k[s]; for (i = 2 * s; i &lt; n; i *= 2) { if (k[i] &lt; k[i + 1] &amp;&amp; i &lt; n) { i++; } if (temp &gt;= k[i]) { break;...

2018-11-05 19:25:06 103

原创 希尔排序

void shellSort(int k[], int n) { int i, j, temp, gap; gap = n; do { gap /= 2; for (i = gap; i &lt; n; i+=gap) { if (k[i] &lt; k[i - gap]) { temp = k[i]; for (j = i - gap; k[j] &gt; t...

2018-11-05 15:49:08 99

原创 归并排序

归并排序递归迭代递归#define MAXSIZE 10void merging(int *list1, int list1_size, int *list2, int list2_size) { int i, j, k, m; i = j = k = 0; int temp[MAXSIZE]; while (i &lt; list1_size &amp;&amp; j &lt; l...

2018-11-05 15:27:15 76

原创 插入排序

void insertSort(int k[], int n) { int i, j, temp; for (i = 1; i &lt; n; i++) { if (k[i] &lt; k[i - 1]) { temp = k[i]; for (j = i - 1; k[j] &gt; temp; j--) { k[j + 1] = k[j]; } k[j ...

2018-11-01 21:33:24 76

原创 选择排序

void selectSort(int k[], int n) { int i, j, min, temp; for (i = 0; i &lt; n - 1; i++) { min = i; for (j = i + 1; j &lt; n; j++) { if (k[j] &lt; k[min]) { min = j; } } if (min !=...

2018-11-01 21:17:21 87

原创 冒泡排序

冒泡排序冒泡排序非常容易理解,比较两个数的大小,进行交换例如数组int k[10] = {2, 3, 5, 1, 0, 4, 9, 8, 7, 6}void bubbleSort_1(int k[], int n) { int i, j, temp; for (i = 0; i &amp;lt; n; i++) { for (j = i + 1; j &amp;lt; n; j++) { if...

2018-11-01 20:44:28 120

原创 关于KVO

KVO KeyValueObserving 事件通知机制介绍流程兼容的调用方式实际应用注意点手动调用KVO实现原理缺点介绍允许对象监听另一个对象特定属性的改变KVO 一对一NSNotificationCenter 一对多KVO可以监听单个属性的变化,也可以监听集合对象的变化KVC的mutableArrayValueForKey: 获得代理对象, 代理对象的内部对象发生改变时,会调用KV...

2018-11-01 20:20:04 100

原创 关于KVC

KVC KeyValueCoding介绍最重要的四个方法KVC设值KVC取值KVC中的keyPathKVC处理异常KVC和容器类KVC和字典KVC的正确性验证KVC的使用介绍通过key名直接访问对象的属性,或者给对象的属性赋值.在运行时动态地访问和修改对象的属性,而不是在编译时确定.NSObject的扩展来实现的(NSKeyValueCoding)最重要的四个方法- (nullable ...

2018-10-31 23:55:49 122

原创 copy和mutableCopy

copy和mutableCopy浅复制:不考虑对象本身,仅仅拷贝指向对象的指针深复制:是直接拷贝整个对象内存到另一块内存中一般情况下,=基本上都是浅复制:UIView *view1 = [[UIView alloc] init];UIView *view2 = [[UIView alloc] init];view1 = view2;view1和view2的内存地址是一样的.cop...

2018-10-12 15:51:38 188

原创 strong和copy

strong和copy通常情况下,NSString和NSArray会使用copy关键字修饰.代码实例://定义Person类@interface Person : NSObject@property (nonatomic, strong) NSArray *array1;@property (nonatomic, copy) NSArray *array2;@end//在View...

2018-10-12 14:28:51 367

原创 atomic和nonatomic

atomic和nonatomic主要区别atomicnonatomic伪代码演示实现总结主要区别系统生成的setter/getter方法不一样atomic生成的方法有加锁操作nonatomic生成的方法不加锁atomic加锁操作只保证了setter/getter的存取方法的线程安全线程1执行了某属性setter方法,执行到一半.线程2调用getter方法.那么会执行完setter方法...

2018-10-12 11:05:23 246

原创 丑数问题

丑数问题问题描述分析再次分析问题描述由2,3,5组成的数,即数由2,3,5因数组成,不含有其他因数.其中1是特殊的丑数.求第n个丑数.[1,2,3,4,5,6,8,9,10,12,...].分析由于只由2,3,5三个因数组成,则可以对数进行因数分解,若只由2,3,5因数组成,则为丑数.从1开始进行循环寻找:int uglyNum(int n) { int number = 1; ...

2018-09-20 15:52:52 732

原创 统计[0, 1, 2, ... , n]中k出现的次数,其中k为0-9任意数.

统计数字问题描述分析问题描述统计[0, 1, 2, … , n]中k出现的次数,其中k为0-9任意数.分析最笨的方法就是for循环每个数,进行叠加计算,方法如下:int digitCounts(int k, int n) { int sum = 0; for (int i = 0; i &amp;lt;= n; i++) { //循环每一个数 int num = i; while...

2018-09-20 10:59:03 240

原创 n!尾部0个数问题

n!尾部0个数问题描述分析挑战再次分析代码实现:描述n!计算尾部有多少个0分析可以先计算出结果,再通过取余的方式,计算有多少个0.但这种方式时间复杂度就是n(while循环n次相乘)挑战时间复杂度logn再次分析n! = 1 x 2 x 3 x 4 x 5 x ... x n;相当于可以凑多少个10出来,即2x5出来(10=2x5,没有别的质数组合),n! = 1 x 2 ...

2018-09-19 16:34:00 251

原创 A+B问题及扩展

A+B问题描述样例挑战位运算知识扩展`&amp;` 按位与`|` 按位或`^` 按位异或`~` 按位取反`&lt;&lt;` 左移`&gt;&gt;` 右移位运算加法扩展减乘除减法乘法除法描述给出两个整数a和b,求它们的和样例如果a=1并且b=2,返回3.挑战你可以直接使用return a+b,但是不使用+运算符位运算知识扩展&amp; 按位与二进制00000110(6),000...

2018-09-19 15:25:35 305

汇编相关指令(ios arm64).pdf

汇编相关指令

2021-12-29

空空如也

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

TA关注的人

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