自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【iOS】YYModel源码学习

在Model和JSON转换过程中需要很多类的元数据,YYModel通过CFDictionaryCreateMutable方法将数据存入缓存中,需要的时候直接拿出来使用,避免了重复解析类的操作。JSONModel中使用KVC将相应的JSON数据赋值给属性,但如果考虑性能的话,Getter和Setter方法的性能要优于KVC,YYModel就是使用getter和setter方法进行赋值,性能优越一点。

2026-07-15 18:41:16 234

原创 【iOS】离屏渲染

这里我简单学习一下有关iOS渲染的相关知识。

2026-07-14 15:57:49 300

原创 【iOS】虚拟内存 & 物理内存

pre-main阶段减少动态库数量合并不必要的自家动态库,减少第三方动态 Framework。对无动态加载需求的库,优先考虑静态链接。减少 main 前自动执行代码避免在 +load、constructor、C++ 全局对象初始化中执行耗时任务。将初始化逻辑改为懒加载、dispatch_once 或 didFinishLaunching 后延迟执行。精简 Objective-C 元数据删除无用类、方法、Category、Protocol。

2026-07-13 20:27:06 232

原创 【iOS】优先级反转

什么是优先级反转?优先级反转指的是一个低优先级的任务持有了一个共享资源的锁,而高优先级的任务获取锁的时候被阻塞,此时中间优先级的任务运行并抢占了CPU执行,导致高优先级的任务被反转到中间优先级的任务之后运行。iOS中如何避免或解决优先级反转问题?优先级继承:确保持有锁的低优先级任务提升到高优先级任务的级别,知道锁被释放,然后恢复到原来的级别。(记录了锁的持有者的api都可以自动避免优先级的反转,系统会通过提高线程的优先级来解决反转问题,如dispatch_sync)

2026-06-26 14:08:37 243

原创 【iOS】数据持久化

出于安全的原因,iOS应用安装的时候为每个APP都分配了独立的目录,APP只能对自己的目录进行操作,这个目录就是沙盒。是苹果提供的一套缓存机制,键值对形式存储,当内存不足时,NSCache会自动清理释放内存,NSCache设置缓存对象数量和占用内存的大小,当缓存超出时自动释放。通过路径重定向,让程序在运行时产生或修改的 plist、文本、图片、图标、媒体等资源文件,不再写入原始位置,而是写入程序自己的目录,从而实现文件隔离和安全管理。可以看到方法的翻译值是一个数组,我们取其中的第一个元素就行。

2026-06-11 16:51:07 415

原创 【iOS】通知传值实现

通知队列,主要用于异步发送消息,这里需要注意的是,这个异步不是开启了一个新线程,而是将通知存储到双向链表实现的队列中,等待runloop到合适的时机进行调用,最终还是通过调用NSNotificationCenter进行消息的分法。​ 参数二:发送通知的对象,可以为nil,主要用于区分通知的来源,如果只关心某个特定对象发出的通知,可·· 以指定object,反之传nil就行,这个表没有通知名也没有object,所以直接退化为了一个链表,存储了可以接收所有通知的类的信息。

2026-06-05 15:46:10 451

原创 【iOS】weak底层实现

我们先定义一段最简单的使用示例:首先我们先看到一个objc_initWeak的底层实现如下:这段代码本质上是在给一个__weak指针做初始化绑定,将弱引用位置登记到runtime的weak表中。(初始化一个 weak 变量,让它弱引用 ,并把这个 weak 变量的位置登记到 runtime 的弱引用表中。)其中的location表示变量本身的地址,即,是保存 weak 指针的那个内存位置newObj表示weak变量要指向的新对象,即下面我们看一下真正的storeWeak实现: 是 Runtime 内部统一

2026-05-21 11:47:36 593

原创 【iOS】autoreleasePool

自动释放池是OC中的一种内存回收机制,可以将加入autoreleasePool中的变量release时机延迟。当创建一个对象,在正常情况下,变量会在超出其作用域的时立即release。如果将对象加入到了自动释放池中,这个对象并不会立即释放,会之后才会被释放。程序从启动到加载完成,主线程对应的runloop会处于休眠状态,等待用户交互唤醒runloop。

2026-05-15 21:36:48 693

原创 【iOS】RunLoop

一般来说线程执行完任务就会退出,而runloop作用就在于,线程一直在处理事件并且不会退出。要实现runloop这种模式关键点就在于怎么管理事件/消息,让线程在没有处理消息时休眠以避免资源占用,在有消息到来的时候立刻被唤醒。runloop就是一个可以管理需要处理的消息与事件的一个对象,CFRunloopRef可以理解为CoreFoundation框架内的NSRunLoop,它提供了纯C函数的API,但是它的API都是线程安全的,而NSRunLoop却不是线程安全的。

2026-05-12 21:51:23 501

原创 【iOS】锁的原理

载自旋锁中线程会反复检查变量状态,线程一直保持执行,所以处于忙等待(CPU空转)。一旦获取了自旋锁,线程就会一直保持该锁直到显示释放。自旋锁避免了进程上下文的调度开销,所以适用于线程阻塞很短时间的场合,atomic自带一把自旋锁​ OSSpinLock​ atomic用于多线程编程中,防止两条线程同时对一公共资源进行读写的机制(将代码切成一个个临界区而达成),获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒​ pthread_mutex: C语言层面的互斥锁,较为底层,性能较好​ NSLock:OC封装

2026-05-10 11:48:16 391

原创 【iOS】SDWebImage源码

是iOS上最流行的异步图片下载和缓存框架,主要功能有异步加载网络图片、自动缓存图片(支持内存缓存和磁盘缓存)、占位图处理(加载前显示默认图片)、GIF支持(可显示动图)、下载进度回调(可以显示下载进度或加载动画)、方便集成UIIMageView/UIButton其中的耗时操作都在子线程中执行,以确保主线程的流畅性。使用的是GCD和ARC。支持后台图片解压缩处理。

2026-05-06 23:06:04 550

原创 【iOS】KVC与KVO

KVC是键值编码,在对象创建完成之后可以动态的给对象属性赋值。KVO是键值观察,提供监听机制,当指定对象的属性被修改之后,则对象会收到通知。实例对象isa的指向在注册KVO观察者之后,由原有类更改为指向中间类中间类重写了观察属性的setter方法classdealloc_isKVOA方法dealloc方法中,移除KVO观察者之后,实例对象isa指向由中间类更改为原有类中间类从创建后,就一直存在内存中,不会被销毁注册观察者&响应验证是否存在sette方法保存信息。

2026-05-01 18:37:03 618

原创 【iOS】类和分类的加载

App 启动时,内核先加载 dyld,dyld 负责加载主程序和依赖动态库。dyld 在初始化过程中会执行各个 image 的 initializer,其中 libSystem 的初始化会触发 libdispatch 和 libobjc 的初始化。libobjc 中的 _objc_init 会调用 _dyld_objc_notify_register,把 map_images、load_images、unmap_image 三个回调注册给 dyld。

2026-04-26 21:43:59 940

原创 【iOS】分类、关联对象

一句话来说就是:镜像进来之后,runtime先将分类登记到未附着表,等待目标类method/remethodize时,再将分类的方法、属性、协议挂到类/元类上,如果分类实现了load方法,再按照“主类先、分类后”的规则调用。之前我们简单学习过分类与扩展的原理,知道了扩展是在编译时就被添加到类中,而分类是运行时才会被整合到类信息中的,这里我们探究一下分类编译后的底层结构。上面的例子我们简单实现了关联对象的流程,下面我们看看关联对象的底层。runtime是通过两步查找,首先根据对象地址找到对象自己的关联表。

2026-04-22 15:29:33 319

原创 【iOS】dyld加载

我们载编译器上点击按钮进行开发调试,其中经历了四个步骤:预处理、编译、汇编和链接。词法分析:将源代码的字符序列分割成一个个的token(关键字、标识符、字面量、特殊符号),例如将标识符放到符号表中语法分析:生成抽象语法树AST,此时运算符号的优先级确定,一些符号的多重语义也确定了。如果出现语法错误就会报错静态分析:分析类型声明和匹配问题。中间语法生成:LLVM编译器先生成一种中间语言LLVM IR,可以在编译期就做一些表达式的优化。

2026-04-21 20:54:59 1515

原创 【iOS】方法交换

在 Objective-C 中,方法交换(Method Swizzling)是一种利用运行时(Runtime)特性,在程序运行时动态交换两个方法实现的技术。这通常用于在不修改原始代码的情况下,为现有方法添加额外逻辑,例如日志记录、性能监控等,是面向切面编程(AOP)的一种实现方式。

2026-04-20 12:40:34 352

原创 【iOS】消息流程探索

首先我们看一下之前学习过的一段代码:通过阅读cache_t的源码我们可以知道,其被分为了三个架构处理:对于这个bucket结构体,区别在于sel与imp的顺序的不同。cache_t探索Cache属性的获取需要通过类首地址平移16字节,即首地址+0x10获取的地址通过对源码的分析,我们可以知道是在的属性中,在结构体中提供了获取属性的方法获取了属性,就可以获取sel-imp了,这两个的获取在结构体中同样提供了相应的获取方法以及下面我们看一下如何在cache中插入一个新缓存的方法:处理扩容首先获取

2026-04-19 16:31:58 533

原创 【iOS】类与对象底层

对象的isa指向类,类也是一个对象即类对象,类对象的位域指向元类元类是系统给的,定义和创建都由系统完成,这个过程中,类的归属来自于元类元类是类对象的类,每个类都有一个独一无二的元类来存储类方法等相关信息元类本身是没有名称的,由于其与类相关联,所以使用了同类名一样的名称。

2026-03-20 22:22:58 671

原创 【iOS】alloc & init & new源码阅读

这是一个高性能的对象分配调度器,如果是现代OC运行时,先快速检查类是否为nil,迅速返回。析构函数:在对象销毁时自动调用的函数,用于释放资源,清理内存。函数名前必须加~,函数名与类名相同,没有返回值,不能带参数,一个类只能有一个析构函数。构造函数:是在创建对象时自动调用的函数,主要作用是初始化对象的数据成员,函数名必须和类名相同,没有返回值类型,可以重载(一个类可以有多个构造函数)通过instanceSize计算内存大小,向内存中申请大小为size的内存,并赋值给obj,所以obj是指向内存地址的指针。

2026-03-17 15:31:31 510

原创 effective-Objective-C-大中枢派发

我们发现,如果调用的是前两个选择子中的任意一个,可以发现这里的ret会由这段代码释放,但是如果执行了第三个则意味着我们不用释放,这样子就容易出现内存泄漏问题,并且在这里,返回值只能是void或者对象类型,不能返回整形和浮点型的内容。队列中有层级关系,所以检查队列的是否为执行同步派发所用的队列的办法并不好用,比如上图中,排在C队列中的块会认为当前队列就是队列C,导致开发者误判认为队列A上可以安全的执行同步派发操作。会让当前线程阻塞,直到指定的任务组中的所有任务都执行完毕,或者达到了指定的超时时间。

2026-03-12 14:33:23 416

原创 iOS-多线程原理

为了提高效率,使用 Runloop source 来实现端口,当端口上没有数据等待时,线程将进入睡眠状态。是事件驱动的,没事会进入休眠。共享变量:多个线程访问同一块内存(全局变量、单例对象、共享数组),这种共享内存块的机制虽然快and简单,但是更加脆弱,必须要使用锁或者其他同步机制仔细保护共享变量。所以可以理解为进程是线程的容器,而线程用来执行任务,在iOS中是单线程开发,一个进程就是一个app,进程之间是相互独立的。线程执行的快慢除了要看优先级,还需要查看资源的大小,即任务的复杂度,以及CPU调度轻快。

2026-03-09 20:31:22 520

原创 effective-Objective-C-详解Block底层

NSLog(@"block1的类 —— %@", [block1 class]);NSLog(@"block2的类 —— %@", [^{} class]);NSLog(@"block3的类 —— %@", [[^{return 0;如果一个block中没有访问任何变量,那么该block就是,在内存中是存在数据区的,即全局区或者静态区。类型的block调用copy方法其实啥都没干。就相当于一个单例。如果block捕获了局部变量,那么它就是一个。

2026-03-08 21:24:07 691

原创 iOS—UITableView性能优化

UITableView的优化本质上是提高滚动性能并减少内存使用,保证使用过程的流畅。核心是通过降低CPU与GPU的工作来提升性能CPU;负责对象的创建和销毁,对象属性的调整、布局的计算、文本的计算与排版、图片的格式转换、解码、图像的绘制接受提交的纹理和顶点描述,应用变换、混合并渲染输出到屏幕上。

2026-03-07 14:10:11 677

原创 effective-Objective-C 第四章阅读笔记

通过加前缀尽量避免。对象之间相互通信的方式很多,广泛使用的是委托模式实现对象间的通信,这个模式的主旨是:定义一套接口,某对象如果想接受另一个对象的委托,就需要遵守这个接口,设置代理对象。在委托模式与数据源模式中,如果协议的方法是可选的,那么就会出现大批判断是否能响应选择子的方法,我们通常将委托对象能否响应某个协议方法的信息缓存起来以优化程序效率。我们也可以定义一套接口,令某类经由该接口获取其所需要的数据,称为数据源模式,在此模式中,在此模式中信息从数据源流向类,而在常规的委托模式中,信息从类流向委托者。

2026-02-18 12:20:20 1406 5

原创 effective-Objective-C 第三章阅读笔记

OC没有其他语言的那种内置的命名空间机制,所以我们需要设法去避免潜在的命名冲突。比无法链接更严重的问题是运行期又载入了含有重名类的程序库,此时,动态加载器就遇到了重名符号错误,可能会使得程序崩溃我们为所有名称都加上适当前缀会大幅度减小出现命名冲突的几率。苹果采用双字符前缀,我们采用三字符前缀。

2026-02-15 19:25:34 1086

原创 effective-Objective-C 第二章阅读笔记

在面向对象语言编程中,对象就是“基本构造单元”,可以通过对象来存储并传递数据。在对象之间传递数据并执行任务的过程就叫做消息传递。程序运行起来后,为其提供相关支持的代码叫做“OC运行期环境”,他提供了一些使得对象之间可以传递消息的重要函数,并且包含创建类实例的全部逻辑我们可以使用给某个对象关联许多其他对象,这些对象通过键区分,存储对象时可以指明存储策略,以维护相应的内存管理语义。

2026-02-08 19:36:44 1037 1

原创 effective-Objective-C 第一章阅读笔记

主要内容包括:1) OC采用消息结构而非函数调用,运行时决定执行代码;2) 内存管理采用引用计数机制,对象存储在堆/常量区;3) 类头文件应减少引用其他头文件,使用@class进行向前声明;4) 推荐使用字面量语法简化代码;5) 建议多用类型变量替代#define预处理指令;6) 枚举的使用技巧和优化方法

2026-02-04 17:50:39 1359

原创 OC-实现下载单例类

在第一个项目中,需要实现歌曲下在的控制,简单实现如下。

2026-02-01 19:41:30 473

原创 OC多线程编程-GCD使用

队列是一种特殊的线性表,遵循FIFO的原则,即任务总是被插入到队列的末尾,而读取任务时总是从队列的头部开始读取。:如果count > 0,将count–并立即返回,如果count == 0,将当前线程挂起(park),直到有线程signal。方法会等待前边追加到并发队列中的任务全部执行完成之后,再将指定的任务追加到该异步队列之中,然后在。会使传入的信号量的值加一,如果信号量的前一个值小于0,则此函数会在返回前唤醒一个等待线程。主队列是一个特殊的串行队列,所有任务必须在主线程执行,UI只能在主线程更新。

2025-11-29 19:44:09 1150

原创 OC高级编程-iOS内存管理之自动引用计数阅读(三)

ARC只是自动帮我们处理引用计数相关部分,本质部分在ARC中并没有改变。我们在编译时可选择ARC的开启或者关闭,我们可以在编译单位上设置ARC有效或者无效,例如每个文件可以选择使用或者不使用ARC。在一个程序中可以混合ARC有效或无效的二进制形式。

2025-11-13 19:56:26 1161

原创 SQLite3语句以及FMDB数据存储初步学习

SQLite3是一款轻量级数据库,常用于嵌入式开发,支持NULL、INTEGER、REAL、TEXT和BLOB五种数据类型。

2025-10-31 18:59:57 1165

原创 OC高级编程-iOS内存管理之自动引用计数阅读(二)

由于NSObject类的Foundation框架并没有公开过,但是Foundation框架所使用的Core Foundation框架的源代码以及通过调用NSObject类进行内存管理的部分源代码是公开的。但是仍然难以理解NSObject内部的实现细节,所以我们使用开源软件GNUStep来说明GNUStep是cocoa框架的互换框架内联函数是C、C++、OC中的一个编译器优化机制,核心目的是在调用函数的地方直接插入函数代码本体,避免函数调用开销。

2025-10-16 18:51:13 734

原创 OC高级编程-iOS内存管理之自动引用计数阅读(一)

自动引用计数是指内存管理中对引用采取的自动计数技术(Automatic Reference Counting),用苹果官方的话来说就是在OC中采用ARC机制,让编译器来进行内存管理。在LLVM编译器中设置ARC为有效状态,就无需再次键入retain或者是release代码。

2025-10-03 17:47:45 1034 2

原创 OC-UICollectionView

是iOS6以后引入的一个新的UI控件,是iOS开发中掌握复杂布局的核心技能之一,比UItableView更灵活,可以实现网格视图、瀑布流、自定义复杂布局等。

2025-09-29 19:34:46 1133

原创 OC-初识NSArray的底层逻辑

当我们定义一个结构体,并在结构体末尾放置一个大小为0的数组时,编译器会将这个数组视为柔性数组,这个柔性数组的大小是在运行时根据需要动态分配内存来确定的。_NSArrayM底层通过一块连续的线性内存模拟环形结构,我们可以将指向 _list的内存想象成一个首尾相接的圆环,元素从 _offset位置开始存储,当存储到内存末尾时,会绕到内存开头继续存储。(实际线性,模拟环形)图示我们可以发现,随着数据的增多,不同遍历方式的性能差别愈发明显,我们觉得的并发遍历方式的耗时确实最高的,反而for-in遍历的性能比较好。

2025-09-23 21:20:14 1073 1

原创 OC-多线程基础

进程是计算机操作系统中资源分配和调度的基本单位。在应用开发中,就是指系统中一个正在运行的应用程序执行的一个实例。(简单来说,程序就是存储在磁盘上的一段静态代码,而进程则是程序运行起来后在内存中的动态执行过程)进程的主要特点:独立性:每个进程都有自己的内存空间、数据、堆栈和其他资源,彼此之间相互隔离动态性:具有生命周期并发性:操作系统可以让多个进程”同时“执行,提高资源利用率组成:代码段:程序的可执行代码数据段:全局变量和静态变量堆:动态分配内存栈:保存函数、局部变量等。

2025-09-21 18:32:48 713 1

原创 OC-动画实现折叠cell

在阅读学长博客的时候,发现了一个很有意思的且看着很高级的折叠cell的demo,对比我的简陋版,属实天差地别,所以特地学习了一遍由于我们的每个单元section的header需要包含标题和按钮的相关属性,所以需要自定义一个UITableViewHeaderFooterView的子类,去实现自定义的header@end在实现文件中,需要我们对相关控件进行初始化//}];}];@end。

2025-09-17 22:04:39 474

原创 OC-AFNetworking

本文旨在实现使用AFNetworking设置一个集中的单通道网络对象,该对象与微级MVC组建分离,可以在整个解耦架构应用程序中重复使用资料来源:https://www.toptal.com/ios/afnetworking-tutorial-with-a-singleton-class?虽然苹果抽象的许多iOS SDK在管理移动硬件的许多复杂性方面做的很好,但是在某些情况下为了保持SDK的灵活性,使用会很复杂。AFNetworking作为开源框架之一,简化了developer的日程任务。

2025-09-16 22:05:35 1031 1

原创 OC-KVC

KVC(键值编码)是iOS开发中通过字符串键名动态访问和修改对象属性的机制,基于NSObject实现。核心方法包括setValue:forKey:、valueForKey:及对应的KeyPath版本,KeyPath支持属性链式访问。当属性不存在时,系统默认抛出异常,但可通过重写setValue:forUndefinedKey:自定义处理。KVC会按setKey、_key等顺序查找成员变量,支持值类型自动封装为NSNumber/NSValue。需注意nil值处理(重写setNilValueForKey:)和类

2025-09-11 15:11:50 796

原创 OC-单例模式

单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。它通过延迟加载(懒汉模式)或预先加载(饿汉模式)实现。懒汉模式使用同步锁或dispatch_once保证线程安全,在需要时才创建实例,节省资源但可能影响性能;饿汉模式在类加载时就创建实例,实现简单但可能浪费资源。单例模式能节省内存但存在全局状态、难以扩展和隐藏依赖等缺点。根据场景选择适合的实现方式,懒汉模式适合访问量小的情况,饿汉模式适合简单且无需延迟加载的场景。

2025-09-09 19:58:03 1251

洛谷入门题,手写题解带思路

手写洛谷入门题解

2025-04-07

空空如也

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

TA关注的人

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