- 博客(80)
- 收藏
- 关注
原创 iOS ------ 事件响应链
当触摸事件发生后,系统会自动生成一个UIEvent对象,记录事件发生的事件和类型然后系统会把UIEvent事件加入到一个由管理的事件队列中然后会讲事件分发给UIWindow,主窗口会在视图层次结构中找到一个合适的响应者对象来处理触摸事件。不断递归调用hitTest方法来找到第一响应者如果第一响应者无法响应事件,那么会按照响应者链往上传递,也就是传递给自己的父视图一直传递直到,如果都无法响应,事件就会被丢弃。
2024-08-09 22:05:53
1760
1
原创 iOS ------ UIKit相关
在model里声明个cellheight属性,用于保存Model对应的cell高度,然后在heightForRowAtIndexPath 方法中,如果当前model的cellHeight为0,说明这个cell没有缓存过高度,则计算Cell的高度,并把这个高度记录在model的cellHeight。通过屏幕扫描的方式,会通过CRT电子枪从上到下逐行扫描,这个扫描的过程就是读取帧缓存区里的数据,当它扫描完的时候,它就会显示一帧的画面, 当显示完一帧画面后,CRT电子枪又回到原来的位置继续重新扫描显示下一帧。
2024-08-09 11:23:36
956
原创 iOS ------ autoreleasePool
自动释放池本质是一个e结构体对象,是一个栈结构存储的页,每一个都是一个双向链表的形式连接。自动释放池的压栈和出栈主要是通过的构造函数和析构函数和调用push操作就是创建一个新的,对的具体操作就是插入一个哨兵,并返回插入哨兵的内存地址,每有对象调用方法,会将对象的内存地址添加进page中。调用pop操作的时候,传入的参数就是push返回的哨兵的内存地址token,从自动释放池最后push的对象开始依次release释放掉,直到遇到哨兵。
2024-08-06 19:58:35
1302
1
原创 iOS ------RunLoop
RunLoop实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行,RunLoop在没有事件处理的时候,会使线程进入睡眠模式,从而节省CPU资源,提高程序性能。简单来说,runloop可以让线程在需要做事情的时候忙起来,不需要的时候让线程休眠,使程序不会结束。
2024-08-03 15:54:11
1296
1
原创 iOS ------ frame和bounds
frame不管对于位置还是大小,改变的都是自己本身。fram的位置是一父视图的坐标系为参照系,从而确定当前视图在父视图中的位置。frame的大小改变时,当前视图的左上角不会改变,只是大小改变。bounds改变位置时,改变的是子视图的位置,自身没有影响,改变了本身的坐标系原点,默认是坐标系的原点是左上角。bounds改变大小时,当前视图的中心点不会改变,当前视图的大小发生改变,以中心点实现缩放的效果。
2024-08-02 10:17:32
913
原创 iOS ------ 持久化
另外,Keychain是系统级存储,还可以被iCloud同步,即使App被删除,Keychain数据依然保留,用户下次安装App,可以直接读取,通常会用来存储用户唯一标识串。2Q算法类似于LRU-2,不同点在于2Q将LRU-2算法中的访问历史队列(注意这不是缓存数据的)改为一个FIFO缓存队列,即:2Q算法有两个缓存队列,一个是FIFO队列,一个是LRU队列。仅当数据的访问次数达到K次的时候,才将数据放入缓存。记录用户对数据的访问次数,将访问次数多的数据降序排列在一个容器中,淘汰访问次数最少的数据。
2024-08-01 16:39:56
727
原创 iOS ------ 锁
自旋锁之所以不安全,是因为自旋锁由于获取锁时,线程会一直处于忙等待状态,造成了任务的优先级反转。而线程不安全,则是在同一个时刻可以有多个线程对该数据进行访问,从而得不到预期的结果。NSConditionLock定义:条件锁,一旦一个线程获得锁,其他线程一定等待。2.如果obj不存在,则调用objc_sync_nil,通过符号断点得知,这个方法里面是什么都没有做,直接return。是一个条件锁,可能平时用的不多,但与信号量相似:线程1需要等到条件1满足才会往下走,否则就会堵塞等待,直至条件满足。
2024-07-31 19:14:59
999
原创 iOS ------ KVO KVC
KVO全称,俗称键值监听,是苹果提供的一套时事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接受事件。一般继承自NSObject的对象都默认支持KVOKVO和NSNotificationCenter都是iOS观察者模式的一种实现。KVO对被监听对象无侵入性,不需要修改内部代码可以实现监听。
2024-07-29 21:44:58
1338
1
原创 iOS ------ alloc retain release
在ARC下,对象的引用计数有编译器自动完成,在alloc对象并将它赋值给强应用的对象,ARC会自动插入该对象的。主要是初始化一个isa指针,初始化isa指针上的has_cxx_dtor,indexcls,magic,nonpointer,shiftcls(存储对象的Class、Meta-Class对象的内存地址信息)这里用到了refcnts,用来存储OC对象的引用计数的 hash表(仅在未开启isa优化或在isa优化情况下isa_t的引用计数溢出时才会用到)。retain的作用是把对象的引用计数加一。
2024-07-26 11:57:04
693
原创 iOS ------ weak的基本原理
weak的原理在底层维护了一张结构的hash表,key是所致对象的地址,value是weak指针的地址数组(weak_entry_t)如果weak指针之前指向了一个弱引用,则会调用方法,在old Obj的中移除weak_ptr地址如果weak指针需要指向一个新的引用,调用方法,将weak_ptr的地址记录到newObj对应的中对象释放时,调用函数根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。
2024-07-22 16:49:29
1364
原创 iOS ------ 编译链接
库就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式本质上是一种可执行代码的二进制文件,可以被载入程序中运行。
2024-07-18 19:36:20
1258
原创 iOS ------ tagged Pointer 内存对齐
因此,编译器会对基本数据类型的合法地址做出一些限制,地址必须是2,4,8的倍数。一个类可能创建多个实例,每个实例的方法都一样,没有差异性,所有对象共用这块存储方法的内存,实际上方法都存储在类实例里面了,一个类只有一个类实例,由系统创建。Data为对象的值)。使用了Tagged Pointer且指针的8歌字节够存储数据,NSNumber对象的值直接存储在了指针上,不会在堆上申请内存。为了使用一个NSNumber对象,需要在堆上为其分配内存,还要维护它的引用计数,管理它的生命周期,影响执行的效率。
2024-07-17 15:57:56
983
原创 iOS ------ 消息传递和消息转发
在进行查找时,OC会运行时会利用缓存机制来提高查找的速度,在方法查找中,他会将最近使用过的方法实现存储在缓存中下次调用相同的方法就可以直接在缓存中获取实现,避免了反复查找的过程。IMP是一个函数指针,这个被指向的函数包含一个接搜消息的对象id(self指针),调用方法的选择子SEL(方法名),以及不定个数的方法参数,并返回一个id.OC编译时会根据方法的名字包括参数序列,生成区分这个方法的唯一ID,不管是子类还是父类,只要方法的名字包括参数序列相同,它们的ID就相同。解释了为什么开头说的该动态解析。
2024-07-16 15:57:00
1697
原创 iOS ------ ARC的工作原理
对于ARC。编译器在代码里适当的地方自动插入retainrelease完成内存管理(引用计数)。但ARC相对于MRC,又不是在编译时添加retain/release/autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。在编译期,ARC用的是更低层C接口实现的,并不通过OC的消息转发机制,而是直接调用其底层C语言版本API,这样做的性能更好,因为保留及释放操作需要频繁的执行,直接调用其底层的函数能节省很多CPU周期。
2024-07-15 16:49:10
1488
原创 iOS ------ 类 父类 元类的总结
类在OC中其实是指向objc_class的结构体指针,结构体构造我Class isa;long info;OC中的对象全部继承objc_object结构体在OC中,对象的类是isa指针决定的,即isa指针指向对象所属的类。类的isa指针指向类它所属的元类。OC对象在发生消息时,运行时库会寻找对象isa指针找到随想所属的类。这个类包含了能应用于这个类所有的实例方法以及指向父类的指针,以便找到父类的实例方法。运行时库会坚持这个类和其父类的方法列表,遭到于消息对应的方法。
2024-07-15 11:23:01
951
原创 iOS ------ 对象和类
return 0;} return 0;} return 0;} return 0;} return 0;} return 0;} return 0;} return 0;
2024-06-11 22:39:00
960
2
原创 iOS ------ 多线程 GCD
一,GCD简介GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。为什么要使用GCD?二,GCD任务和队列sync同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。只能在当前线程中执行任务,不具备开启新线程的能力。async异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。可以在新的线程中执行任务,具备开启新线程的能力。
2024-05-30 22:03:38
1056
原创 iOS ------ 多线程 pthread,NSThread
pthread是一套通用的多线程的API,可以在Unix/Linux/Windows等系统跨平台使用,使用C语言编写,需要程序员自己管理线程的生命周期,使用难度大。
2024-05-29 19:51:45
1180
原创 iOS ------多线程NSOperation,NSOperationQueue
NSOperation,NSOperationQueue是苹果提供我们的一套多线程解决方案。实际上NSOperationa,NSOperationQueue是基于GCD更高一层的封装。但是比GCD更简单易用,代码可读性也会更高。为什么要使用NSOperation,NSOperationQueue可添加完成的代码块,在操作完成后执行添加操作之间的依赖关系,方便控制执行顺序设置操作执行的优先级可以很方便的取消一个操作的执行。
2024-05-26 20:55:05
1172
原创 iOS ------ 多线程基础
简单就是把一个处理器划分为若干个段的时间片,每个进程会被操作系统分配一个时间片(即每次被CPU选中来执行当前进程所用的时间),每个时间片依次轮流地执行处理各个应用程序,时间一到,无论进程是否运行结束,操作系统就会强制将CPU这个资源转到另一个进程去执行,由于每个时间片很短,对于每个程序,就好像为自己单独服务,从而达到多个程序同时进行的效果。我们一般使用比较多的是 GCD,因为开发者只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码,但这也是 GCD 的不够灵活的地方,我们。
2024-05-15 21:32:56
1275
原创 iOS ------ MRC
这里只是发送release消息,如果当时的引用计数依旧不为0,则对象依然不会被释放,autorelease方法返回对象本身,且调用完autorelease方法后,对象的计数器不变。如果将新值直接赋给实例变量,而没有堆旧值进行适当的释放操作,旧值的引用计数就从不会减少,对象的内存也不会释放,这就会导致内存泄漏。当一个对象被复制给一个实例变量,为了确保对象在使用时保持有效,需要增加对象的引用计,这样可以保证在其他地方意外释放对象。时,开发者只需要关注对象的强引用和弱引用,无需关心对象的引用计数。
2024-05-12 20:38:28
966
原创 iOS ------ 内存五大分区
在方法内部,可以使用_cmd来获取当前方法的选择器,从而进行一些运行时的操作,比如动态调用其他方法。虚拟内存将应用程序的内存地址空间分割成固定大小的页面(Page),并将这些页面映射到物理内存或者存储设备上的磁盘空间。其中,全局变量是指变量值可以在运行时被动态修改,而静态变量是static修饰的变量,包含静态局部变量和静态全局变量。在iOS中,内存被分为五大区域:栈区,堆区,全局/静态区,常量区,代码区。一般情况下应用程序是不需要考虑堆和栈的大小的,但是事实上堆和栈都不是无上限的,self和_cmd。
2024-05-08 22:22:41
896
原创 iOS ------ JSONModel源码
除了一些框架自己处理的错误(比如传入的对象不是字典),框架的作者也允许我们自己定义属于我们自己的错误。比如,当age对应的数值小于25的时候,打印出Too young!,并阻止模型的转换if (!return NO;return NO;return YES;如果要被转化的数据age小于25,就会打印错误,并且模型也不会转化。简化的数据映射:JSONModel提供了简单而直观的方式来将JSON数据映射到Objective-C对象的属性上。
2024-05-06 19:45:01
1377
原创 iOS ------ Method Swizzling (动态方法交换)
Method(方法)对应的是objc_method结构体;而objc_method结构体中包含了SEL method_name(方法名),IMP method_imp(方法实现)// objc_method 结构体// 方法名// 方法类型// 方法实现Method(方法),SEL(方法名),IMP(方法实现)三者的关系:在运行中,class(类)维护了一个method list(方法列表)来确定消息的正确发送。
2024-04-29 20:34:59
1566
原创 iOS ------代理 分类 拓展
OC是动态的,我们可以手动添加。一种常见的方法就是通过runtime.h 中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成对象。在其他地方使用注意,以上代码只是手动实现了setter/getter方法,但调用_成员变量依然会报错。关联对象并不存储在被关联对象本身的内存中,而是有一个全局统一的AssociationManager中。
2024-04-23 21:39:34
1511
3
原创 iOS ------ Block的总结
通过上面的block的额用法发现,block每次回调是通过它的匿名函数进行的,也就是每次最多执行一个回调,在需要进行大批量的回调的时候,就需要写很多不同的block回调,这样就不合适这时使用协议和代理的方式就自然多了。除此之外,block还比较适合线程之间的切换回调,GCD就是采用了多线程结合block来做的。
2024-04-18 20:36:40
1889
原创 iOS------SDWebImage源码
一个异步图片下载及缓存的库一个扩展UIImageView分类的库,支持加载网络图片并缓存图片异步图片下载器异步图片缓存和自动图片有效期限管理支持GIF动态图片支持WebP背景图片减压保证同一个URL不会再次下载保证无效的URL不会重新加载保证主线程不会死锁性能优越使用GCD和ARC支持ARM64位处理器。
2024-04-14 20:56:29
892
原创 OC高级编程 第3章:Grand Central Dispatch
Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可以执行任务,这样就比以前的线程更加有效率。也就是说GCD用简洁的记述方法,实现了极为复杂繁琐的多线程编程。上面的就是在后台线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。
2024-03-25 19:25:55
1020
原创 O C高级编程 第二章: Blocks
Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。“带有自动变量”在Blocks中表现为“截取自动变量"“匿名函数”就是“不带名称的函数”块,封装了函数调用及调用环境的OC对象block的声明// 1.// 2.BlockType:类型别名// 3.// 返回值类型(^block变量名)(参数1类型,参数2类型,...)block的定义// ^返回值类型(参数1,参数2,...){};// 1.无返回值,无参数// 2.无返回值,有参数。
2024-03-06 21:14:47
3597
1
原创 第四章:协议和分类
此模式可以将数据与业务逻辑解耦。比如说,用户界面里有显示一系列数据所用的视图,那么,此视图只应包含显示数据所需的逻辑代码,而不应该决定要显示何种数据以及数据之间如何交互的问题。视图对象的属性中,可以包含负责数据与事件处理的对象。
2024-02-02 22:22:20
810
原创 第二章 对象,消息,运行期
有时需要在对象中存放相关信息,这时我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象。然而并非所有情况下都能这么做。OC中有一项强大的特性可以解决此问题,这就是“关联对象可以给某对象关联许多其他的对象,这些对象通过“键”来区分。存储对象值的时候,可以指明“存储策略”(storage policy),用来维护“内存管理语义”。假如关联对象成为了属性,那么它就具备对应的语义此方法以给定的键和策略为某对象设置关联对象值。此方法根据给定的键从某对象中获取相应的关联对象值。
2024-01-19 22:51:35
1059
2
原创 iOS ------ 调用高德地图SDK
4.输入pod install下载SDK(若下载的SDK不是最新版可输入pod repo update进行更新)将上面步骤获取的高德Key,配置到代码中,以保证地图功能的正常运行。这里使用CocoaPods安装SDK,方法和前面导入第三方库相同。1.打开终端,cd 文件路径 进入到所创建的项目文件中。2.输入pod init为该项目创建Podfile文件。1.import MAMapKit.h 头文件;3.将MAMapView添加到Subview中。3.编辑 Podfile 文件。申请 iOS Key。
2023-12-06 21:01:45
1399
原创 iOS ------ UICollectionView
一,UICollectionView的简介UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似。
2023-12-04 21:54:28
1652
1
原创 知乎日报第四周总结
FMDB库的使用类似于C语言的文件操作,需要我们手动创库,之后编译器会生成一个文件用于数据的存储,当程序关闭后,文件中的内容也不会消失,当程序重新启动后,会继续利用从而达到本地持久化。以上面的查询为例,获取数据库文件的路径,获取数据库,注意文件的路径必须一样。数据的添加,删除,查询。
2023-11-12 19:56:53
330
原创 知乎日报第三周总结
最开始时我直接就在cell加载函数判断了回复的的行数并进行了相应的加载,导致在按钮的点击事件无法改变回复的展开与收回。这里需要先讲将每个评论cell的加载状态存放在数组里,没次cell的加载都通过每个评论cell的对应的数组内容进行判断,在按钮的点击事件里改变数组的内容,然后将tableView重新加载。2,对于评论的回复的展开和收起,我们需要先判断是否用回复,同时还要判断回复的行数是否超过两行,如果超过两行,就要添加回复的展开与收起按钮,否者就将按钮隐藏。对于如何计算评论的行数的代码。
2023-11-05 19:51:05
293
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人