- 博客(93)
- 收藏
- 关注
原创 【iOS】#include、#import、@class、@import
在.h文件中能使用@class尽量使用,而不是#import,#import尽量延后导入,能不使用尽量不使用,可以提高编译效率。
2024-06-20 19:00:57
1125
1
原创 【iOS】nil、Nil、NULL、NSNull的区别
nil:对象指针的空值。Nil:类指针的空值。NULL:C指针的空值。NSNull:集合中表示空值的对象。
2024-06-19 19:23:40
586
原创 【iOS】YYModel源码阅读笔记
先前写了JSONModel的源码阅读笔记,同时在之前了解到YYModel也是一个JSON转模型的第三方库,而且性能极高,许多公司都在使用这个模版,而且无侵入性,因此想阅读一下YYModel的源码并且与JSONModel对比找出其性能高的原因至此我们终于把YYModel的源码剖析完了,因为笔者去阅读YYModel是为了与JSONModel进行对比,想找出为什么YYModel的性能远远优于JSONModel,为此笔者总结了以下几点。
2024-06-11 15:31:56
868
原创 【iOS】JSONModel源码阅读笔记
JSONModel是一个很经典的源码库,先前基本把iOS的底层看的差不多了,暑假之前都会进行源码与算法学习JSONModel提供了一种方法,得到的JSON数据自动与Model进行匹配还提供了keyMapper将JSON键自动映射到模型的属性还让我们可以自定义错误处理这里再讲一下JSONModel的实现流程:方法中通过获取JSONModel类的属性列表,与传入的JSON数据自动匹配,同时还可以通过KeyMapper修改不相同的映射,如果模型类与JSON。
2024-06-09 15:03:42
1259
原创 【iOS】Runtime
之前分part学习了Runtime的内容,但是没有系统的总结,这篇博客用来总结学过的所有Runtime知识Runtime又叫运行时,是一套底层的C语言API,是iOS系统的核心之一在编码阶段中,当我们向一个对象发送消息时,编译阶段只是确定了我们需要向接收者发送消息,但是接收者如何响应与处理这条消息是运行时决定的,我们来看一个例子#import // 基类 Animal@end} @end// Dog 类继承自 Animal@end");
2024-06-03 23:23:44
862
2
原创 【iOS】Runloop
先前学习了Runtime的内容,现在来学习一下Runloop本文介绍玩Runloop,应该懂得:Runloop事件上就是一个事件循环,也可以当作一个对象,这个对象实际上就是用来处理消息与事件的,其提供了一个入口函数去执行EventLoop同时Runloop中又包含五种Mode,其中最常用的是,Mode中又有ModeItems的集合,如果一个Mode中没有items,那么runloop就会退出,items是指。
2024-05-30 11:22:25
835
原创 【iOS】Block总结
之前的Block写的没啥重点,这一次总结一下重点,比如Block如何捕获外界变量,__block的使用Block的重点其实就在于捕获自动变量与使用__block修饰时forwarding指针的变化,还有其发生拷贝的时机:使用__block变量,使用dispatch API, 手动copy与作为函数返回值另外重要的还有block的循环引用,后面会一起总结循环引用。
2024-05-27 12:46:15
1068
原创 【iOS】内存分区
最近看源码啥的看的头大,最近学一些容易理解其他知识栈区存储临时变量、函数参数以及函数地址,数据结构符合先进后出堆区存储运行时创建的对象,数据结构符合先进先出常量区存储字符串字面量,常量区的字符串是唯一的代码区存储存放函数的二进制代码,只允许读取操作全局静态区存储全局变量与静态变量,分为两个区域,一个为BSS区存储未初始化的变量,另一区域存储已经初始化的全局静态变量。
2024-05-19 12:57:07
726
原创 【iOS】锁
iOS中的锁主要可以分为两大类,互斥锁与自旋锁,剩下的其他锁其实都是这两种锁的延伸与扩展我们先用一张对比图来引出我们今天要讲的锁OSSpinLocK自旋锁由于性能问题,底层已经用替代,这是一种非常高效的锁,用于替代不再推荐使用的OSSpinLock。它避免了忙等,而是使线程休眠,但在锁竞争激烈的情况下可以保持高性能。但推荐执行时间较短的任务使用,否则会造成CPU资源消耗atomic。
2024-05-18 20:38:52
1154
原创 【iOS】frame与bounds区别
在学习响应者链的过程中用到了frame与bounds的混用,这两个属性经常出现在我们的开发中,特别撰写一篇博客分析区别首先,我们来看一下iOS特有的坐标系,在iOS坐标系中以左上角为坐标原点,往右为X正方向,往下是Y正方向如下图:我们来看一下frame与bounds在文件中的定义bounds默认边界为原点0,frame大小。可以做成动画frame可以做成动画。如果视图被转换,不要使用frame,因为它不能正确反映视图的实际位置。使用bounds + center代替。同时可以看到他们都是CGRect。
2024-05-10 00:22:23
511
1
原创 【iOS】事件传递与响应机制
提到响应者链与事件传递,如果看过其他人的博客,经常能看到这经典的三张图本文会对事件的传递与响应机制进行详细的讲解当触摸事件发生后,系统会自动生成一个UIEvent对象,记录事件产生的时间和类型然后系统会将UIEvent事件加入到一个由管理的事件队列中然后将事件分发给UIWindow,主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件不断递归调用hitTest方法来找到第一响应者如果第一响应者无法响应事件,那么按照响应者链往上传递,也就是传递给自己的父视图一直传递直到。
2024-05-09 17:17:59
1577
原创 【iOS】多线程
这两天将iOS的多线程的使用都看了一遍,iOS的多线程方案有许多,本篇博客主要总结一下不同方案之间的区别以及面试一般会问到的问题。
2024-05-07 01:38:30
1000
原创 【iOS】NSOperation、NSOperationQueue
寒假学习了GCD,前几天学习了NSThread,今天来学习iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。是苹果提供给我们的一套多线程解决方案。实际上 NSOperation是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。需要配合来实现多线程。
2024-05-06 22:57:32
1177
原创 【iOS】KVO
KVO的全称,俗称“键值监听”,可以用于监听某个对象属性值的改变。KVO是一种机制,它允许将其他对象的指定属性的更改通知给对象。理解KVO之前,必须先理解KVC(即KVO是基于KVC基础之上)KVC是键值编码,在对象创建完成后,可以动态的给对象属性赋值,而KVO是键值观察,提供了一种监听机制,当指定的对象的属性被修改后,则对象会收到通知,所以可以看出KVO是基于KVC的基础上对属性动态变化的监听我们知道也是一种监听方式,那么KVO与有什么区别呢?
2024-05-05 13:47:01
1261
1
原创 【iOS】KVC
KVC的全称是,翻译成中文叫做键值编码KVC提供了一种间接访问属性方法或成员变量的机制,允许通过字符串来访问对应的属性方法或成员变量它是一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用Setter、Getter方法访问。KVO就是基于KVC实现的关键技术之一。
2024-05-04 23:51:05
1104
2
原创 【iOS】pthread、NSThread
五一这两天准备将GCD相关的知识完,同时与也是相关知识,这一篇文章主要讲解的学习pthread是一套用C语言编写的多线程API,可以在等系统跨平台使用,尽管现在已经不常用,但是还是可以了解。
2024-05-03 22:58:02
1227
原创 【iOS】方法交换(Method Swizzling)
上文讲到了iOS的消息发送机制,在消息机制中我们了解到了SEL、IMP等方法知识,由此延伸到iOS黑魔法方法交换,本篇着重讲解iOS的方法交换的应用场景与原理这篇文章主要总结了的各种应用场景,例如防止按钮被多次点击,进行hook操作以及数组与KVO的兜底操作,应用场景非常广泛,值得深入学习iOS Crash防护系统-IronManiOS KVO 崩溃防护笔记。
2024-05-03 12:06:54
1530
1
原创 【iOS】消息流程分析
前文学习了OC的类和对象的底层原理,看到结构体中涉及到方法列表,特此来学习一下消息发送以及消息转发SEL:方法选择器,实际上就是一个字符串的名字IMP:指向方法实现首地址的指针Method:是一个结构体,包含一个SEL表示方法名、一个IMP指向函数的实现地址、一个Char*表示函数的类型(包括返回值和参数类型)SELIMPMethod之间的关系当向对象发送消息时,调用SEL在对象的类以及父类方法列表中进行查找Method,因为Method结构体中包含IMP指针,因此一旦找到对应的Method就直接调用。
2024-04-30 17:10:31
1519
原创 【iOS】分类,扩展与关联对象
上一篇章我们探究了类与对象的底层,这一篇我们探究一下分类,扩展与关联对象由于分类没有成员变量列表,所以无法添加成员变量。与此同时他有属性列表,但只会声明属性,不会去实现set与get方法。如果要在分类中使用属性就需要使用关联对象分类在运行时被整合到类中,扩展在编译时被整合到类中,因此分类中方法不实现不会报警,扩展会扩展常用于声明私有属性与方法如果分类中的方法与类中方法重名,分类中的方法会替代类中的方法。
2024-04-23 17:06:32
1081
3
原创 【iOS】类与对象底层探索
这篇文章主要探索OC对象的本质首先我们需要明白我们平时编写的OC代码,底层实现都是C\C++代码通过这篇文章我们得知所有对象都有isa属性所有对象都是由objc_object继承而来的objc_class中存放着对象的各种信息,实例对象则存放成员变量,类对象则存放实例方法与属性等,元类对象则存放类方法,符合单一职责原则isa 指针指向对象所属的类可以从bits中的rw中查找方法属性,但不能查找到成员变量,成员变量存储在ro中,这也是为什么分类不能添加成员变量的原因。
2024-04-23 13:55:18
1059
原创 【iOS】SDWebImage源码阅读笔记
最近基本已经将项目完结,这个月开始专心学习源码,将会陆续学习SDWebImage,AFNetworking以及JsonModel的源码由此我们总结一下SDWebImage的调用流程首先我们会进入方法中,然后进入sd-InternalmageWithURL方法中,在这个方法中我们首先通过取消正在运行的任务,任务是通过方法取消的,这一步是为了避免同一资源被重复下载,接着我们初始化(这里因为是单例,所以只初始化一次),接着进行一系列配置后调用方法,首先检查URL是否在错误的集合中,如果没有就调用。
2024-04-15 15:00:04
915
原创 【iOS】UITableView性能优化
最近基本将我的第二个项目完结,之后会记录一些源码的学习以及优化项目的一些方法,而在iOS中是最为常用的一种控件,今天我们就从性能优化开始讲起UITableView的性能优化涉及到了许多层面,下到底层的Layer属性,上到第三方库SDWebImage与RunLoop,这些东西的实现都十分巧妙,还有很长一段路需要学习这里笔者写一下Tableview 性能优化方法总览实现Tableview的懒加载以及cell的复用。
2024-04-07 18:33:24
1714
原创 【iOS】Leaks使用
最近写完项目后在学一些项目的优化内容,刚好了解到instruments有Leaks这个工具,当我在我的项目中使用恰好检测出了内存泄漏的问题,特此记录但是很遗憾,虽然我的代码虽然用Leaks工具发现了内存泄漏问题,但并无法定位,这可能是因为问题出在一些第三方库中,当然也可能确实是自己的问题,但是自己找不到,但总归是了解了一种定位内存泄漏的方法,目前的问题以我的知识还无法解决,以后学会了再加以补充。
2024-04-07 10:32:07
519
原创 【iOS】Blocks
先前看了小蓝书上的block,发现不甚了解,现重新学习blockBlocks 是 C 语 言 的 扩 充 功 能。可 以 用 一 句 话 来 表 示 Blocks 的 扩 充 功 能 :带 有 自 动 变 量 (局 部变量)的匿名函数。我们把这句话拆分开来理解自动变量也就是局部变量匿名函数即不带名称的函数。
2024-03-18 13:36:14
1121
2
原创 【iOS】系统框架
本次博客撰写小蓝书的最后一章系统框架Objective-C的系统库包含相当多的collection 类,其中有各种数组、各种字典、各种 setoFoundation框架定义了这些collection及其他各种collection所对应的Objective-C类。与 之相似,CoreFoundation 框架也定义了一套C语言API,用于操作表示这些collection 及其他 各种collection 的数据结构。例如,
2024-02-19 19:14:19
1295
1
原创 【iOS】GCD学习
本博客撰写一下小蓝书的GCDGrand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。//让处理在后台线程中执行/**长时间处理*例如AR用画像识别*例如数据库访问*//*
2024-02-19 04:01:24
1093
原创 【Effective Objective - C 2.0】——读书笔记(五)
要管理其内存,ARC就必须在“回收分配给对象的内存”是生产必要的清理代码。
2024-02-17 04:02:57
1033
原创 【Effective Objective - C 2.0】——读书笔记(四)
如果类中本来就有此方法,而分类又实现了一次,那么分类中的方法就会覆盖原来的那一份实现代码。并且我们之前有说过私有方法的命名,通过特殊的前缀将私有方法指示出来,那么我们学了分类规划之后,我们还可以通过创建一个分类,这个分类其中全是私有方法,通过这种方法将这些私有方法都规划到一个类中,当然其还是的遵循之前的命名规则。”将其的“==只读”属性改为“可读写”==的,那么这样下来,在外部看来他就是一个“只读”的属性,但是你可以在其内部自定义的设置其值了,他在内部来说就是“可读写”的了。
2024-02-13 03:00:41
1072
原创 【Effective Objective - C 2.0】——读书笔记(三)
使用Cocoa 创建应用程序时一定要注意,Apple 宣称其保留使用所有“两字母前缀” (two-letter prefix)的权利,所以你自己选用的前缀应该是三个字母的。十六、提供全能初始化方法所有对象均要初始化。初始化时,有些对象可能无须开发者向其提供额外信息,不过一般来说还是要提供的。以iOS的UI框架UIKit为例,其中有个类叫做UITableViewCell,初始化该类对象时,需要指明其样式及标识符,标识符能够区分不同类型的单元格。由于这种对象的创建成本较高,所以绘制表格时可依照标识符来复用,
2024-02-12 05:06:00
1362
原创 【Effective Objective - C 2.0】——读书笔记(二)
这是一篇为了快手✌️xmy学长写的博客关联对象的出现在iOS开发里,分类是不能添加成员变量的,只允许给分类添加属性,所以出现了关联对象具体使用后面应该会学到,这里直接进行要点总结。要点总结可以通过“关联对象”机制来把两个对象连起来。定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系”。只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于查找的bug。
2024-02-11 03:23:32
1254
原创 【Effective Objective - C 2.0】——读书笔记(一)
最近寒假学习了【Effective Objective - C 2.0】这本书,特此总结提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2024-02-10 03:20:20
935
原创 【iOS】UICollectionView
UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似。简单来说,UICollectionView是比UITbleView更加强大的一个UI控件,有如下几个方面:1、支持水平与垂直布局2、通过layout配置的方式进行布局3、CollectionView中Item的大小与位置可以自由定义4、通过layout布局回调的代理方法,可以动态的定制每个item的大小和collection的大体布局属性。
2023-12-23 16:51:35
2162
2
原创 【iOS】Bug调试
在我们的编码过程中我们出现bug在所难免,有时找出这些bug十分耗费精力,调试可以帮我们找出程序中的bug,笔者特此撰写以下博客记录iOS中使用Xcode找出bug的高效方法。
2023-12-03 12:42:50
1313
原创 【iOS】实现评论区展开效果
在知乎日报的评论区中,用到了Masonry行高自适应来实现评论的展开,这里设计许多控件的约束问题,当时困扰了笔者许久,特此撰写博客记录。
2023-11-22 21:37:14
878
原创 【iOS】知乎日报
近期耗时一个月完成了第一个项目知乎日报,用到了JSONModelMasonryFMDB等一系列第三方库以及其他新学的知识点,整体采用了MVC框架进行编写,特此撰写博客总结知乎日报耗时一个月,在此期间碰到了许多问题,例如网络请求的异步加载问题,Masonry实现行高自适应的控件约束问题,单元格内按钮的复用问题,tableview的优化问题以及使用MVC框架中各个层的职责问题,总结便是学习iOS之路任重道远,还需更加努力。
2023-11-22 14:19:12
681
原创 【iOS】JSONModel的基本使用
JSONModel 是一个用于 Objective-C 的开源库,它用于简化 JSON 数据与 iOS 应用中的数据模型之间的转换。其最主要的优点就是简化JSON数据解析与减少模型代码的编写,JSONModel可以将json数据直接映射到我们的对象中,对于我们获取的数据更加方便。同时对于模型的嵌套数据的获取更加便捷。
2023-10-18 13:59:58
1017
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人