自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 【iOS】设计模式复习

文章摘要:本文详细介绍了iOS中常见的观察者模式(通知机制和KVO机制)及其实现原理。通知机制通过NSNotificationCenter实现,包括注册观察者、创建和发送通知的基本使用,以及多线程处理、异步发送和NSNotificationQueue队列等高级用法。KVO机制通过isa-swizzling实现属性监听,支持手动触发和一对多监听。此外还介绍了单例模式、代理模式等设计模式,包括GCD实现、懒汉/饿汉式单例,以及代理模式的选择原则(block或delegate)。文章最后总结了设计模式的六大原则和

2025-09-13 19:46:06 1199

原创 【iOS】block复习

文章摘要: Block本质是一个包含自动变量的匿名函数,底层实现为结构体,包含isa指针、标志位、空间大小和函数指针。在内存管理方面,MRC需手动copy到堆上,ARC会自动处理;Block会捕获外部变量,对对象类型会强引用。循环引用可通过weak/strong配合或手动中断持有关系解决。Block有栈Block、堆Block和全局Block三种类型,使用时需注意判空和内存管理规范,MRC下属性需用copy修饰。

2025-09-07 18:30:48 721

原创 【iOS】关键字复习

文章摘要:本文系统梳理了Objective-C内存管理相关机制。重点分析了weak的实现原理:通过Runtime维护的weak哈希表,在对象释放时自动置nil。探讨了SideTable结构,包含自旋锁、引用计数表和弱引用表。详细阐述了weak变量的初始化、赋值和释放流程。对比了strong/copy修饰符的差异:copy意在数据隔离,可能进行深拷贝。深入解析了容器和自定义类的深浅拷贝实现,以及归档解档实现完全拷贝的方法。最后总结了retain/release的底层原理和各类关键字......

2025-09-01 19:07:27 1213 1

原创 【iOS】内存管理及部分Runtime复习

本文系统梳理了iOS开发中的核心内存管理机制和相关底层原理。主要内容包括:1)继承链与isa指针结构,详细解析了类与元类的继承关系及指针指向;2)MRC与ARC的内存管理实现差异,重点说明ARC在编译期和运行期的优化策略;3)消息传递与转发机制,包括动态方法决议和快速/慢速转发流程;4)对象底层结构分析,涵盖isa指针的位域设计和class_rw_t/class_ro_t的区分;5)TaggedPointer优化技术和小对象的内存对齐规则;6)编译链接过程及dyld3的改进特性;7)动态库与静态库的....

2025-08-25 19:41:47 932

原创 【iOS】YYModel第三方库源码

YYModel源码解析摘要: YYModel通过高效缓存机制(CFDictionary存储类元数据)、优化赋值方式(直接调用Getter/Setter代替KVC)和纯C函数实现性能提升。其核心架构分为YYClassInfo(封装Runtime结构体)和NSObject+YYModel(转换逻辑)两大模块。转换流程包括:1)JSON统一为NSDictionary;2)提取Model元信息(处理黑白名单/容器泛型);3)通过CFDictionaryApplyFunction遍历填充数据...

2025-08-22 20:57:14 803

原创 【iOS】SDWebImage第三方库源码学习笔记

本文介绍了iOS图片加载框架SDWebImage的核心功能与实现原理。SDWebImage通过分类为UIImageView和UIButton提供异步图片下载与缓存功能,主要特性包括:自动处理图片下载、内存/磁盘双缓存、同一URL避免重复下载、错误URL自动识别等。其核心流程为:首先检查内存缓存,未命中则查询磁盘缓存,仍未找到则发起网络下载,下载完成后将图片存入缓存并显示。框架采用单例模式管理下载与缓存,通过operation队列控制任务执行,确保线程安全。文章详细分析了从图片请求到显示的全过程......

2025-08-21 15:58:40 914

原创 【iOS】NSRunLoop

RunLoop是iOS中实现线程常驻的核心机制,它通过事件循环管理线程任务。RunLoop与线程一一对应,通过全局字典存储关系。RunLoop包含多个Mode,每个Mode管理Source、Timer和Observer三类事件源。Source0处理应用内事件,需手动唤醒;Source1基于端口自动唤醒线程。Timer是时间触发器,Observer用于监听RunLoop状态。常见应用场景包括:优化TableView图片加载、解决滑动时Timer失效问题、AFNetworking的常驻线程等......

2025-08-20 19:15:02 821

原创 【iOS】内存管理

本文系统梳理了iOS内存管理的核心机制,重点分析了内存分布模型、小对象优化、自动释放池等关键技术。内存分布方面,系统将3GB分配给五大区(栈、堆等)和保留区,1GB给内核区。小对象优化通过TaggedPointer技术实现高效存储,直接在指针中编码值数据,避免堆内存分配,提升3-100倍性能。自动释放池采用AutoreleasePoolPage双向链表结构,每页存储505个对象,通过哨兵对象界定释放范围,结合RunLoop实现内存自动释放。文章还深入解读了retain/release的引用计数管理逻辑...

2025-08-19 14:40:05 1090

原创 【iOS】Block补充

本文深入探讨了Block的内存管理机制,重点分析了Block捕获外部变量的四种情况:自动变量通过值捕获(拷贝当前值)、静态局部变量通过指针捕获、全局变量直接使用而不捕获。文章详细解析了Block_copy()函数的实现逻辑,包括堆区Block的创建过程。针对循环引用问题,提出了weak-strong-dance、__block修饰、参数传递等多种解决方案,并强调必须正确调用block才能避免内存泄露。通过源码分析,揭示了Block从栈区到堆区的拷贝机制及其对引用计数的影响。

2025-08-18 17:19:43 632

原创 【iOS】锁的原理

文章摘要:本文深入探讨了iOS中各种锁的使用原理和性能对比。锁的类型包括自旋锁(OSSpinLock)、互斥锁(pthread_mutex、NSLock)、递归锁(NSRecursiveLock)、条件锁(NSCondition)和信号量(dispatch_semaphore)。重点分析了@synchronized底层实现,它实际上是一个递归互斥锁,通过链表结构存储SyncData,虽然性能较低但使用方便。文章还比较了不同锁的适用场景:简单线程安全使用NSLock,循环嵌套推荐@synchronized..

2025-08-18 11:31:58 1382

原创 【iOS】多线程原理

本文系统梳理了iOS多线程编程的核心概念与实现方式。主要内容包括:1. 基础概念:线程与进程的区别,线程与RunLoop的关系,影响任务执行速度的因素;2. 线程安全:互斥锁与自旋锁的对比及应用场景;3. 实现方式:详细解析了NSThread、GCD和NSOperation三大技术,重点对比了GCD与NSOperation的优缺点;4. GCD深入:函数与队列的不同组合(串行/并发队列+同步/异步派发)、栅栏函数、信号量等高级用法;5. NSOperation特性:任务依赖、优先级设置和并发控制等。文章强调

2025-08-15 19:38:03 1254

原创 【iOS】KVC原理及自定义

本文深入探讨了iOS开发中的KVC(Key-Value Coding)机制。首先介绍了KVC的定义和基本API,包括setValue:forKey:/valueForKey:等核心方法。详细分析了KVC的底层实现原理:设值过程遵循set<Key>、set<Key>、<key>、_is<Key>的顺序查找;取值过程则按get<Key>、<key>、is<Key>等顺序查找。文章还提供了自定义KVC的实现方案......

2025-08-14 09:13:11 747

原创 【iOS】类扩展与关联对象

本文分析了类扩展和关联对象的底层原理。类扩展(匿名分类)可在编译时直接给类添加属性和方法,属性会生成带下划线的成员变量及set/get方法,方法会被添加到methodlist中。关联对象通过runtime的objc_setAssociatedObject和objc_getAssociatedObject实现,核心是全局唯一的AssociationsHashMap哈希表,其中包含ObjectAssociationMap来存储键值对。当第一次关联对象时,会设置isa标志位has_assoc=1。分类不能直...

2025-07-29 19:11:53 1231

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

本文深入分析了Objective-C中类和分类的加载流程,主要从_objc_init方法入手,探讨了dyld与Objc的关联机制以及类和分类的加载细节。文章首先介绍了_objc_init中的关键初始化方法,包括环境变量设置、线程初始化等。随后重点分析了map_images和load_images的调用时机和功能:map_images负责将Mach-O中的类信息加载到内存,而load_images则处理+load方法的调用。在类加载部分,详细解读了readClass和realizeClassWithou...

2025-07-28 20:38:05 811 2

原创 【iOS】dyld加载流程——应用程序的加载

我们平时编写的程序的入口函数都是main.m文件里面的main函数,但在重新load方法后,会发现load方法是在main函数之前执行的,那么在main函数之前到底发生了哪些事呢?这篇文章我们就来探究一下。dyld是苹果操作系统中的动态链接器,负责在程序启动时将程序依赖的动态库(dynamic libraries)加载到内存,并完成符号解析与重定位,以确保程序能够正常运行。在应用被编译打包成可执行文件格式的Mach-O文件之后 ,交由dyld负责链接,加载程序。

2025-07-14 09:10:55 1001

原创 【iOS】方法与消息底层分析

摘要: OC方法调用的本质是通过objc_msgSend发送消息,包含接收者和方法编号。查找流程分为快速查找(缓存)和慢速查找(继承链递归),若未命中则进入动态方法决议(resolveInstanceMethod)和消息转发(快速转发forwardingTargetForSelector或慢速转发forwardInvocation)。动态方法决议执行两次,分别在快速查找失败和慢速转发前提供补救机会。消息转发机制允许将未实现的方法委托给其他对象处理,避免崩溃。核心流程包括:缓存搜索→父类链递归→动态决议→消息

2025-07-13 17:37:39 929

原创 【iOS】cache_t分析

本文详细解析了Objective-C底层结构cache_t的实现机制。cache_t作为方法缓存的核心结构,采用哈希表存储sel-imp对,主要包含_bucketsAndMaybeMask、_maybeMask等关键字段。文章重点剖析了insert方法的三个核心流程:1)计算缓存占用量,通过occupied值跟踪当前存储的sel-imp数量;2)根据3/4装载因子阈值判断是否需要进行两倍扩容;3)通过哈希算法处理sel存储位置,解决哈希冲突问题。文中还解释了mask作为哈希掩码的作用......

2025-06-05 20:16:44 1098

原创 【iOS】类结构分析

本文深入探讨了Objective-C中类的底层结构和原理。通过反编译和源码分析,揭示了类的本质是objc_class结构体,它继承自objc_object,表明“万物皆对象”。objc_class包含isa指针、父类指针、方法缓存和类数据等属性,其中isa指针用于关联元类。类的属性和方法存储在class_data_bits_t中,而成员变量则存放在class_ro_t中。实例方法存储在类中,类方法存储在元类中。文章还解释了isKindOfClass和isMemberOfClass方法的区别,并提供了....

2025-05-20 19:05:04 1134

原创 【iOS】alloc的实际流程

本文探讨了Objective-C中alloc方法的实际调用流程与源码流程的差异。通过分析,发现实际运行中alloc方法并不直接进入源码中的_objc_rootAlloc等函数,而是通过更高效的底层路径执行。这主要得益于Apple对运行时的优化,如汇编级别的快速路径和ISA优化。对于NSObject类,系统进行了特殊优化,直接使用缓存或特殊入口,而自定义类则通过消息转发机制最终调用NSObject的alloc方法。

2025-05-15 19:11:21 1020

原创 【iOS】alloc & init & new底层原理

本篇文章解析了 Objective-C 中 alloc、init、new 的底层实现机制,梳理了从 callAlloc 到 _class_createInstanceFromZone 的完整调用链,说明对象创建的三步核心:计算内存、申请内存、绑定 isa。同时讲解了内存对齐算法 (value + 15) & ~15 的原理及作用,最后对 init 和 new 的区别做了简要说明。

2025-04-20 20:04:30 1504

原创 【Mac】git使用再学习

由于笔者最近在准备合作完成第二个项目,在写项目的过程中,要用到git来更好地合作,而笔者之前学习有关git的知识比较浅显而且长时间不使用,已经忘得差不多了,现在重新学习一下git,这次学习git主要有三个方面:学会如何使用github建立自己的代码库学会一些常见的git命令,用来远程合作。学习git的工作流(声明:本篇文章所有的工作都通过github和macOS操作系统进行,所有内容都以github为例)GitFlow。

2025-03-02 20:48:41 1203

原创 OC高级编程之GCD

GCD是异步执行任务的技术之一。它可以将程序中记述的线程管理用的代码在系统级中实现。GCD的线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,比以前的线程更有效率。//长时间处理//例如AR用画像识别//例如数据库访问//长时间处理结束,主线程使用该处理结果。//只在主线程可以执行的处理//例如用户界面更新})});可以发现,GCD使用了Blocks,进一步简化了应用程序代码。

2025-02-24 17:54:58 1140

原创 OC高级编程之Blocks

带有自动变量的匿名函数匿名函数就是指不带名称的函数。Blocks提供了类似C++和OC类生成实例或对象来保持变量值的方法。如果带有“自动变量值”,Blocks会保持自动变量的值Blocks的概念,在其他语言中其实也存在,只是名称不同。

2025-02-24 17:47:20 1407

原创 《Effective Objective-C》阅读笔记(下)

使用无缝桥接技术,可以在Foudation框架中的OC对象与CoreFoudation框架中的C语言数据结构之间来回转换。使用无缝桥接,可以将collection转换为具备特殊内存管理语义的collection。比如字典的键为“拷贝”,而值为“保留”,这时就只能使用无缝桥接来改变语义。

2025-02-24 17:28:52 2555

原创 《Effective Objective-C》阅读笔记(中)

比如:我们用某个类来表示个人信息,该类中还存放了一些引用指向此人的朋友,开发者可以添加或删除朋友,那这个属性就要用可变的set来实现。这种情况下,通常应该提供一个readonly属性供外界使用,返回一个不可变的set,这个set是内部可变set的一份拷贝。

2025-02-24 17:16:31 1337

原创 《Effective Objective-C》阅读笔记(上)

关联对象相当于把对象变成字典,不同的键对应不同的值。设置关联对象值时,通常使用静态全局变量做键。存储关联对象时,可以指明存储策略,来维护内存管理语义。

2025-02-24 17:06:58 1398

原创 【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)

变量作用域结束时,虽然随着持有强引用的变量obj失效,对象随之释放,但由于__bridge_retained转换使变量p看上去处于持有该对象的状态,因此该对象不会被废弃。这是因为由malloc函数分配的内存区域没有被初始化为0,因此nil会被赋值给附有__strong修饰符的并被赋值了随机地址的变量中,从而释放一个不存在的对象。bridge_transfer转换提供与此相反的动作,被转换的变量所持有的对象在该变量被赋值给转换目标变量后随之释放。retained转换可使要转换赋值的变量也持有所赋值的对象。

2024-12-15 21:00:19 965

原创 【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(三)

因此,使用附有__autoreleasing修饰符的变量作为对象取得参数,与除alloc/new/copy/mutableCopy外其他方法的返回值取得对象完全一样,都会注册到autoreleasepool,并取得非自己生成并持有的对象。像该源代码的声明一样,对象不注册到autoreleasepool也能传递,但是为了在使用参数取得对象时,贯彻内存管理的思考方式,我们要将参数声明为附有__autoreleasing修饰符的对象指针类型。weak修饰符的变量obj,变量obj持有对持有对象的弱引用。

2024-12-08 19:31:00 1164

原创 【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(二)

包含NSObject类的Foundation框架的源代码没有公开,不过Foundation框架使用的Core Foundation框架的源代码以及通过调用NSObject类进行内存管理部分的源代码是公开的。为此,我们使用开源软件GNUstep来说明,对内存分配的区域本身进行多重化管理,根据使用对象的目的、对象的大小分配内存,从而提高内存管理的效率。尽管如此,在大量产生autorelease的对象时,只要不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时会产生内存不足的现象。

2024-12-01 19:33:33 979

原创 知乎日报仿写总结

知乎日报前三周总结。

2024-11-24 19:02:46 720 2

原创 知乎日报前三周总结

在这几周进行了知乎日报的仿写,这篇博客来总结一下前三周仿写的内容。

2024-11-10 14:19:19 1538

原创 【iOS】SDWebImage的使用

在写知乎日报时,通过接口申请到的网络数据中,有一部分用来表示图片的数据,使用URL表示的,要再次通过URL获取到图片,才能直接使用图片(UIImage),通过SDWebImage第三方库可以很好地解决这个问题,接下来就介绍一下SDWebImage的使用方法。

2024-10-27 16:40:25 895

原创 【iOS】使用AFNetworking更方便实现网络请求

在研究spotify时,发现AFNetworking在处理一些需要涉及到请求头和请求体的网络请求会非常方便,与headers和parameters参数有关,这些知识之后会再进行完善。

2024-10-20 17:13:14 1299

原创 【iOS】YYModel

关于YYModel,其实还有一些Model和字典之间的转换,以及匹配不到字典对应键时的处理,这些东西之后会再完善。

2024-10-20 17:13:00 1617

原创 【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数

自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。用苹果官方说明的话说:在OC中采用ARC机制,让编译器来进行内存管理,在新一代Apple LLVM编译器中设置ARC为有效状态,就无需再键入retain或者release代码。也就是说,只要满足以下条件,就无需手动输入retain和release代码了:使用Xcode4.2或以上版本使用LLVM编译器3.0或以上版本编译器选项中设置ARC为有效。

2024-09-22 17:58:39 1449

原创 【iOS】KVC

定义:KVC(Key-value coding)键值编码,是指iOS开发中,允许开发者通过key名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法。使用KVC键值编码的好处就是可以在运行时动态地访问和修改对象的属性,而不是在编译时确定。注意:在实现了访问器方法的类中,使用点语法和KVC访问对象差别不大,二者可以混用。但是在没有访问器方法的类中,无法使用点语法,这时KVC就有优势了。//直接通过Key来取值//通过Key来取值//通过KeyPath来取值。

2024-09-22 17:50:38 1753

原创 【iOS】单例模式

单例模式,简单地说就是一个类只对应一个对象,每次使用这个类时,都只能获取到那一个对象。它的详细定义如下:如果一个类始终只能创建一个实例,则这个类被称为单例类。有一个全局的接口来访问这个实例。当第一次载入的时候,它通常使用延时加载的方法创建单一实例。

2024-09-15 18:57:30 1894 2

原创 【iOS】present和push

present和push都用于iOS的视图切换,并且切换都是可逆的,原始视图不会被销毁,还可以直接更改window的rootViewController来切换视图,但是这种方法不可逆,并且原始视图会被销毁present一般用于不同业务界面的切换,push一般用于同一业务不同界面的切换present和dismiss对应,push和pop对应present只能逐级返回,push有栈控制,但是可以返回任意级?

2024-09-15 18:43:54 1737

原创 【iOS】ViewController的生命周期

InitloadView()当需要展示view而view为nil时,ViewController会调用loadView方法。viewDidLoad()类成员对象和变量的初始化都在这个方法里,在创建类后无论视图展现还是消失,这个方法只会在布局时调用一次viewWillAppear():视图将要展现的时候调用viewDidAppear():视图已经出现时调用viewWillLayoutSubviews()用于处理视图布局的变化,通常在这里执行与布局相关的操作,在子视图重新布局之前调用。

2024-09-15 18:40:21 1379

原创 【iOS】MVC设计模式

总的来说,MVC模式就是将一个程序分为了三个部分,model负责处理数据,view负责处理视图,controller负责处理逻辑。但是model、view和controller之间并不是一一对应的关系。⚠️Model 和 View 是相互独立的。

2024-09-08 19:12:29 931

空空如也

空空如也

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

TA关注的人

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