- 博客(107)
- 收藏
- 关注
原创 Masonry源码
这篇文章是 Masonry 框架源码的解析和笔记。学习Masonry之前,先了解这个框架设计的初衷—传统的利用系统API进行纯代码布局的不足。然后,根据Masonry常见的几个链式语法中,顺藤摸瓜地了解Masonry的调用栈。最后,学习并思考这个框架用到的设计模式和链式编程思想。
2024-02-21 16:02:53
996
原创 iOS开发 之 isEqual与hash
isEqual方法的作用大家肯定是知道的:判断两个对象是否相等但是判断相等不是已经有==运算符了么, 为什么还要isEqual方法?这是因为:对于基本类型, == 运算符比较的是值;对于对象类型, ==运算符比较的是对象的地址(即是否为同一对象)注意: 上述==运算符的说明适用于Objective-C和Java等不支持运算符重载的语言, 支持运算符重载的语言有C++所以要理清==运算符和isEqual方法的区别, 问题就集中在什么叫比较对象的地址, 什么叫比较对象。
2024-02-21 11:18:00
953
原创 AFNetWorking源码
的职责比较单一,只处理公钥和验证的逻辑,其定义是一个单例对象。此类主要由四个属性和一个方法构成。// 证书验证方式// 本地自签名证书集合// 是否验证证书的合法性(是否允许自签名证书)// 是否验证域名是否有效如果进行细分的话,的功能基本就两个。一个是通过CA的方式进行验证,另一个就是进行自签名验证。:是最主要的方法,用来进行证书的合法性验证。对请求数据的序列化,以及返回数据的反序列化做了很多处理。使开发者只需要传入一个字典即可构建请求参数,无需处理拼接到URL后面或参数转换为body。
2024-02-20 16:49:06
1188
原创 集合NSSet、字典NSDictionary的底层实现原理
Foundation框架下提供了很多高级数据结构,很多都是和Core Foundation下的相对应,例如NSSet就是和_CFSet相对应,NSDictionary就是和_CFDictionary相对应。了解集合NSSet和字典NSDictionary的底层实现原理前,如果不了解Hash表数据结构的话,建议先去了解一下。
2024-02-20 11:14:03
1275
原创 Swift 指北
Swift 包含了 C 和 Objective-C 上所有基础数据类型,除了我们熟悉的类型,Swift 还增加了 Objective-C 中没有的高阶数据类型比如(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。Swift 还增加了,用于处理值缺失的情况。可选表示 “那儿有一个值,并且它等于 x ” 或者 “那儿没有值”。可选有点像在 Objective-C 中使用 nil ,但是它可以用在任何类型上,不仅仅是类。
2024-02-18 15:24:16
764
原创 Swift--字符、字符串与集合类型
开发者也可以通过遍历数组的下标来获取数组中的元素,和String类型不同的是,数组中的下标可以是Int类型,而String中的下标是严格的Index类型,这里需要注意,不要混淆。”为范围运算符,在后面的章节中会详细介绍,offsetBy参数传入的是下标移动的位数,若向其中传入正数,则下标向后移动相应位数,若向其中传入负数,下标向前移动相应位数。数组数组中对加法运算符也进行了重载,开发者可以使用“+”进行两个数组的相加,相加的结果即将第2个数组中的元素拼接到第1个数组后面。需要注意,相加的数组类型必须相同。
2023-11-13 11:18:03
335
原创 UIKit相关
第一次加载创建tableView的时候,是屏幕上最多可以显示几行cell就先创建几个cell,此时复用池里什么都没有开始下滑tableView,刚开始滑动时由于第一行没有完全滑出屏幕进复用池时下面新cell已经显示到屏幕上了,所以下方这个新划出来的cell就是新创建的cell而不是复用的cell(复用时也得看新加载的cell和复用池中的备用cell有没有同类型的id,没有就不复用),然后接着滑动第一个cell就完全出屏幕进入复用池了,下面我们接着滑动,接着那个需要新显示出来的cell。
2023-08-02 20:09:28
259
原创 iOS--Runloop
一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状态,等待有事件需要处理的时候,再醒来处理。简单的来说,。
2023-07-31 19:49:32
1327
2
原创 iOS--frame和bounds
frame不管对于位置还是大小,改变的都是自己本身。frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置。frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变。bounds改变位置时,改变的是子视图的位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角。bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就像缩放一样。
2023-07-31 11:42:46
1057
原创 iOS--runtime
***创建类*superClass: 父类,传Nil会创建一个新的根类*name: 类名*extraBytes: 额外的内存空间,一般传0*return:返回新类,创建失败返回Nil,如果类名已经存在,则创建失败。
2023-07-30 19:55:19
1244
原创 多线程之GCD应用
执行\队列串行队列并发队列主队列全局队列同步执行按序执行,不开辟线程按序执行,不开辟线程死锁按序执行,不开辟线程异步执行按序执行,开辟线程乱序执行,开辟线程按序执行,不开辟线程乱序执行,开辟线程是一种基本的数据类型,可以用来监听一些底层的系统事件:定时器事件源,用来生成周期性的通知或回调:监听信号事件源,当有UNIX信号发生时会通知:监听文件或socket事件源,当文件或socket数据发生变化时会通知:监听进程事件源,与进程相关的事件通知:监听Mach端口事件源。
2023-07-29 11:20:05
363
原创 iOS--多线程原理
线程是进程的基本执行单元,一个进程的所有任务都在线程中执行进程想要执行任务,必须得有线程,进程至少要有一条线程程序启动会默认开启一条线程,这条线程被成为主线程或UI线程队列,又称为伫列(queue),是先进先出的线性表,在具体应用中通常用链表或者数组来实现。装载线程任务的队形结构。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
2023-07-28 12:04:41
206
原创 iOS中的一些锁
OSSpinLock不再安全,底层用替代atomic只能保证settergetter时线程安全,所以更多的使用nonatomic来修饰读写锁更多使用栅栏函数来实现在底层维护了一个哈希链表进行data的存储,使用进行加锁和底层都是对的封装和是条件锁,当满足某一个条件时才能进行操作,和信号量类似普通场景下涉及到线程安全,可以用NSLock循环调用时用循环调用且有线程影响时,请注意死锁,如果有死锁问题请使用。
2023-07-28 11:33:20
125
原创 iOS--KVO和KVC
KVO的全称是,俗称“键值监听",可以用于监听某个对象属性值的改变;KVO是苹果提供的在套事件通知机制。KVO和都是iOS中观察者模式的一种实现,区别是:NSNotificationCenter可以是一对多的关系,而KVO是一对一的;
2023-07-27 14:42:39
154
原创 DYLD--动态链接器
是苹果操作系统一个重要组成部分,在系统内核 XNU 完成 Mach-O 文件的加载,做好程序准备工作之后,交由 dyld 负责余下的工作。在 macOS 系统中,dyld 位于。
2023-07-25 16:58:11
288
原创 iOS--通知、代理、单例模式总结
首先创建一个自定义文件,继承自NSObject,用作自定义通知的类,因为通知是可以实现多对多关系的,所以我们在这个类中还需要定义一个可变的字典属性,用来存储注册的通知。又因为注册的通知数据需要一直保存下来,所以我们使用单例来完成这一操作,保证我们在想要访问已经注册的通知的时候,其数据是存在的。
2023-07-25 16:33:28
1125
原创 iOS-持久化
1.快速展示,提升体验已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户2.节省用户流量(节省服务器资源)对于较大的资源数据进行缓存,下次展示无需下载消耗流量同时降低了服务器的访问次数,节约服务器资源。(图片)3.离线使用。用户浏览过的数据无需联网,可以再次查看。部分功能使用解除对网络的依赖。(百度离线地图、图书阅读器)无网络时,允许用户进行操作,等到下次联网时同步到服务端。4.记录用户操作。
2023-07-25 11:13:39
1282
原创 iOS--weak的底层
1、weak的原理在于底层维护了一张weak_table_t结构的hash表,key是所指对象的地址,value是weak指针的地址数组。2、weak 关键字的作用是弱引用,所引用对象的计数器不会加1,并在引用对象被释放的时候自动被设置为 nil。3、对象释放时,调用clearDeallocating函数根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。
2023-07-22 15:04:27
1274
原创 iOS--属性关键字
chat:在iOS开发中,属性关键字是用于声明类的属性(实例变量)的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。
2023-07-22 09:38:23
699
原创 Block再探
用一句话来说,Block是个对象(其内部第一个成员为isa指针)在构造函数中,我们可以看到;我们对isa指针进行了赋值,相当于该block实例的父类。在将Block作为OC对象调用时,关于该类的信息放置于中,这也证明了block出生就是在栈上(isa指针指向//相比前面的例子就是在定义Block之前多定义了一个NSObject *obj对象,以供Block去捕获 NSObject * obj = [ [ NSObject alloc ] init ];
2023-07-20 16:34:42
117
1
原创 虚拟内存、内存分页、分段、段页式内存管理
为了在多进程环境下,使得进程之间的内存地址不受影响,相互隔离,于是操作系统就为每个进程独立分配一套的虚拟地址空间,每个程序只关心自己的虚拟地址就可以,实际上大家的虚拟地址都是一样的,但分布到物理地址内存是不一样的。作为程序,也不用关心物理地址的事情。每个进程都有自己的虚拟空间,而物理内存只有一个,所以当启用了大量的进程,物理内存必然会很紧张,于是操作系统会通过内存交换技术,把不常使用的内存暂时存放到硬盘(换出),在需要的时候再装载回物理内存(换入)。
2023-07-15 11:24:29
385
原创 iOS--编译
静态分析会对代码进行错误检查,如出现方法被调用但是未定义、定义但是未使用的变量等,以此提高代码质量。这一步是把词法分析生成的标记流,解析成一个抽象语法树(abstract syntax tree – AST),同样地,在这里面每一节点也都标记了其在源码中的位置。这一步把源文件中的代码转化为特殊的标记流,源码被分割成一个一个的字符和单词,在行尾Loc中都标记出了源码所在的对应源文件和具体行数,方便在报错时定位问题。在我们的代码中,后面的代码会按照 16(2^4) 字节对齐,如果需要的话,用 0x90 补齐。
2023-07-10 18:52:25
1015
原创 内存的五大分区
是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。
2023-07-08 11:30:46
9347
6
原创 Swift学习笔记(一)基础语法
浅学一下Swift,这篇笔记做个记录//引入UIKit框架 import UIKit //定义一个变量,赋值为字符串“hello,playground” var greeting = "Hello, playground"
2023-06-10 21:29:07
2585
4
原创 【iOS】--响应者链
记住 先触发响应者事件,接着触发触摸事件,也就是先寻找命中者!!!!!刚开始一直没搞懂,现在明白了。触摸事件传递过程是从父控件到子控件,即由UIApplication将事件发送到最顶层的控件,然后由这个控件向下逐级传递事件,直到找到最合适的处理者为止。在传递过程中,如果一个控件能够响应事件,那么就会处理事件并结束传递;如果不能响应事件,那么就会将事件传递给下一个响应者。而响应者链的传递过程则是从子控件到父控件。
2023-06-05 14:08:00
1486
原创 Xcode多个子工程结合联编开发SDK
打开Myworkspace->File->new->project选择iOS->Staci Library给他起个名,我起了MySDK然后Add to:MyWorkspace然后我们就能看到三个不同的项目在一个Workspace里了。
2023-05-16 21:43:24
904
原创 [iOS]消息传递和消息转发
1.从本类的 method list (二分查找/遍历查找)查找imp2.从本类的父类的cache查找imp(汇编)3.从本类的父类的method list (二分查找/遍历查找)查找imp…继承链遍历…(父类->…->根父类)里找cache和method list的imp4.若上面环节有任何一个环节查找到了imp,跳出循环,缓存方法到本类的cache,并返回imp5.直到查找到nil,指定imp为消息转发,跳出循环,执行动态方法解析resolveMethod_locked。
2023-05-16 20:07:59
1459
原创 【iOS】--手势操作
但是连续型手势要复杂一些,就拿旋转手势来说,如果两个手指点下去不做任何操作,此时并不能识别手势(因为我们还没旋转)但是其实已经触发了触摸开始事件,此时处于状态0;对于离散型手势 UITapGestureRecgnizer 要么被识别,要么失败,点按(假设点按次数设置为1,并且没有添加长按手势)下去一次不松开则此时什么也不会发生,松开手指立即识别并调用操作事件,并且状态为3(已完成)。离散型手势的特点:一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的回调方法)。创建手势识别器对象实例。
2023-05-10 16:36:04
959
原创 【iOS】-- GET和POST(NSURLSession)
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。AFNetworking是一个功能非常强大的框架,主要是用于网络请求,把复杂的原生代码封装好,我们只需要简单的几步就可以完成网络请求。下面我们是代理方法的使用步骤。,也就是task,可以把它当作所谓的任务。
2023-05-10 15:16:50
1170
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人