╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,CSDN博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获CSDN iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、CSDN第一届猿创征文优质博文奖,以及多项优秀TOP博文、CSDN开源挑战赛优秀奖等。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C语言经典面试题之深入解析 字符串拷贝的 sprintf、strcpy和memcpy使用与区别
sprintf 指的是字符串格式化命令,是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串,直到出现字符串结束符 '\0' 为止。原创 2021-09-19 18:18:05 · 7124 阅读 · 2 评论 -
iOS经典面试题之深入解析一个触摸事件是如何识别并执行具体逻辑的
iOS触摸事件处理流程分为硬件层、系统层和应用层。硬件层通过IOKit将电容屏信号转换为IOHIDEvent,发送给SpringBoard。系统层由SpringBoard决定目标App并通过mach port转发事件。应用层中,UIApplication将事件转换为UIEvent并放入队列,由主线程RunLoop处理。事件通过Hit-Testing确定第一响应者,沿响应者链传递,手势识别器和UIControl可介入处理。多点触控、3D Touch等特殊场景也有相应机制。整个过程确保了触摸事件的高效处理和精准原创 2026-04-08 16:36:54 · 242 阅读 · 0 评论 -
iOS经典面试题之对于多线程进行for循环自加会出现的结果分析
本文分析了多线程并发执行自增操作时的数据竞争问题。当t个线程各自循环m次对共享变量count执行自增操作时,最终结果范围是[m, t×m]。最小值m出现在最极端竞争情况下,所有线程每次自增都读取相同旧值;最大值t×m出现在完全串行化无冲突时。这是由于count++的非原子性导致,底层包含读取、修改、写回三个可能被交叉执行的指令。解决方案包括使用原子操作、锁机制、GCD串行队列或信号量等同步方法。文章通过具体示例和指令级分析,阐明了多线程环境下数据竞争的本质及应对策略。原创 2026-04-07 15:36:22 · 19 阅读 · 0 评论 -
iOS经典面试题之深入解析什么是原子操作
iOS开发中的原子操作提供轻量级线程同步,主要包括三种方式:1) Swift 6+的Atomic结构体,提供类型安全的现代方案;2) OSAtomic系列函数(已废弃),支持整型、布尔值的原子操作;3) OC的atomic属性修饰符,仅保证setter/getter原子性。OSAtomic包含递增/减、CAS、位运算等操作,但需注意地址对齐问题。虽然原子操作比锁性能更高,但复杂场景仍需其他同步机制。建议新项目优先使用Swift的Synchronization框架。原创 2026-04-02 17:21:58 · 94 阅读 · 0 评论 -
iOS经典面试题之深入分析“内存平移”的原理
一、抛砖引玉现在有一个YDWPerson类 ,其中有一个属性 name 和一个实例方法saySomething,如下: @interface YDWPerson : NSObject @property (nonatomic, copy) NSString *name; - (void)saySomething; @end @implementation YDWPerson - (void)saySomething { NSLog(@"%s",__func__);原创 2021-03-20 20:48:53 · 11072 阅读 · 2 评论 -
iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理
isa 指针的作用对象的isa指向类,类的isa指向元类(meta class),元类isa指向元类的根类,isa 帮助一个对象找到它的方法;isa 是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而C lass 里也有个isa的指针, 指向 meteClass(元类),元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针原创 2020-09-15 23:40:06 · 7379 阅读 · 1 评论 -
iOS经典面试题之深入解析runtime是如何实现weak变量的自动置nil
一、weak 属性特点weak 表明该属性定义了一种“非拥有关系” (nonowning relationship);为 weak 属性设置新值时,设置方法既不保留新值,也不释放旧值;同 assign 类似,然而在属性所指的对象释放时候,属性值也会清空(nil out)。二、runtime 如何实现 weak 属性① 实现步骤初始化时:runtime 会调用 objc_initWeak 函数,初始化一个新的 weak 指针指向对象的地址。添加引用时:objc_initWeak 函数会调用原创 2021-03-20 21:35:06 · 875 阅读 · 1 评论 -
iOS经典面试题之分析GCD的dispatch_group任务执行问题
① dispatch_group 异步执行任务现有以下调度组 dispatch_group 执行多个任务,将 dispatch_group_notify 放在调度组异步执行任务,那么它们的任务执行顺序是怎么样的呢? dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_group_enter(group);原创 2021-04-06 02:59:50 · 3181 阅读 · 1 评论 -
iOS经典面试题之分析self class与super class的区别和底层原理
一、区别与联系[self class] 就是发送消息 objc_msgSend,消息接收者是 self,方法编号 class;[super class] 本质就是 objc_msgSendSuper,消息的接收者是 self,方法编号 class,在运行时,底层调用的是 _objc_msgSendSuper2;objc_msgSendSuper2 会更快,会直接跳过 self 的查找。二、代码分析现有一个 YDWTeacher 类,继承于 YDWPerson 类,在 init 打印 [sel原创 2021-04-07 01:36:20 · 4406 阅读 · 1 评论 -
iOS经典面试题之使用runtime associate方法关联的对象释放及dealloc底层原理
一、题目分析使用 runtime associate 方法关联的对象,需要在主对象 dealloc 的时候释放吗?无论在 MRC 下还是 ARC 下均不需要,被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject - dealloc 调用的 object_dispose() 方法中释放。调用 release :引用计数变为零,对象正在被销毁,生命周期即将结束,不能再有新的 __weak 弱引用,否则将指向 nil,调用 [self dealloc]。父类调用 dealloc原创 2021-04-07 02:30:22 · 11320 阅读 · 1 评论 -
iOS经典面试题之深入分析block相关高频面试题
一、前言本文重点来研究一下 objc 的 block,并具体分析以下面试题目:block 的内部实现,结构体是什么样?block 是类吗?有哪些类型?一个 int 变量被 __block 修饰与否的区别?block 的变量如何截获?block 在修改 NSMutableArray,需不需要添加 __block?block 怎么进行内存管理?block 可以用 strong 修饰吗?解决循环引用时,为什么要用 __strong、__weak原创 2021-11-15 21:50:59 · 29178 阅读 · 2 评论 -
iOS经典面试题之深入解析分类Category的本质以及如何被加载
Category 是 Objective-C 2.0 之后添加的语言特性,Category 的主要作用是为已经存在的类添加方法。extension 看起来很像一个匿名的 Category,但是 extension 和有名字的 Category 几乎完全是两个东西。extension 在编译期决议,它就是类的一部分,在编译期和头文件里的 @interface 以及实现文件里的 @implement 一起形成一个完整的类,它伴随类的产生而产生亦随之一起消亡。............原创 2022-08-25 21:26:01 · 1220 阅读 · 0 评论 -
iOS经典面试题之深入解析objc对象的内存空间、数据结构以及isa指针的理解
一、objc 对象的 isa 的指针指向什么?有什么作用?二、一个 NSObject 对象占用多少内存空间?三、实例对象的数据结构四、类对象的数据结构五、class_rw_t 的理解六、class_ro_t 的理解原创 2022-08-29 14:49:33 · 1498 阅读 · 0 评论 -
iOS经典面试题之深入解析Runtime如何通过selector寻找对应的IMP地址
类对象中有类方法和实例方法的列表,列表中记录着方法的名词、参数和实现,而 selector 本质就是方法名称,runtime 通过这个方法名称就可以在列表中找到该方法对应的实现。objc_class 的底层定义声明了一个指向 struct objc_method_list 指针的指针,可以包含类方法列表和实例方法列表。......原创 2022-08-29 21:40:04 · 1103 阅读 · 0 评论 -
iOS经典面试题之深入分析图像的解码渲染与基本原理
UlImage 是 iOS 中处理图像的高级类,创建一个 UlImage 实例只会加载 Data Buffer,将图像显示到屏幕上才会触发解码,也就是 Data Buffer 解码为 Image Buffer,Image Buffer 也关联在 Ullmage 上。Ullmage 关联的图像是否已解码对外部是不透明的,没有办法判断,其实在日常的内存消耗来讲,图片的渲染是特别消耗内存的。接下来来探究一下究竟是为什么?............原创 2022-08-29 19:55:08 · 2588 阅读 · 0 评论 -
iOS经典面试题之从原理到实战全方位对比堆和栈的区别
本文对比了iOS开发中栈与堆内存的核心区别。栈由编译器自动管理,存储局部变量和临时数据,地址连续且访问速度快;堆需手动或ARC管理,存储对象实例和动态内存,地址不连续且访问较慢。通过地址特征、连续性测试和性能基准测试,文章展示了栈在速度上的优势以及堆在灵活性上的特点。最后总结了二者在地址分布、访问速度、适用场景等方面的差异,并提供了使用建议:小数据用栈,大数据和共享对象用堆,避免栈溢出和内存泄漏风险。原创 2026-04-29 15:30:55 · 8 阅读 · 0 评论 -
Swift经典面试题之深入解析强制解包:从感叹号运算符到可选类型安全处理的全面分析
Swift中的强制解包(!)是一种直接从可选类型中取出值的操作,若值为nil会导致程序崩溃。它适用于开发者能100%确定值非nil的情况,但存在严重风险。相比隐式解包可选类型(Type!),强制解包需要手动添加!运算符。安全替代方案包括可选绑定、空合并运算符等。实际开发中应尽量避免强制解包,必须使用时需添加注释说明非nil保证,特别是在处理不可靠数据源时更应谨慎。最佳实践建议优先使用安全解包方式,仅在特殊场景(如IBOutlet)才考虑强制解包。原创 2026-04-02 16:09:15 · 193 阅读 · 0 评论 -
C++经典面试题之深入解析内存对齐
众所周知,为了保证每个对象拥有彼此独立的内存地址,C++空类的内存大小为1字节。而非空类的大小与类中非静态成员变量和虚函数表的多少有关。其中,类中非静态成员变量的大小则与编译器的位数以及内存对齐的设置有关。原创 2023-04-19 15:20:41 · 1086 阅读 · 0 评论 -
C++经典面试题之深入解析const修饰指针的作用
我们知道,当一个变量用 const 修饰后就不允许再改变它的值,那么如果在定义指针变量的时候用 const 修饰会怎样呢?当用 const 进行修饰时,根据 const 位置的不同有三种作用,原则是:谁被修饰谁的内容就不可变,其它的都可变。原创 2023-02-03 14:02:13 · 1355 阅读 · 4 评论 -
C++经典面试题之深入解析list、vector和deque的联系和区别
List 封装了链表,Vector 封装了数组,list 和 vector 得最主要的区别在于 vector 使用连续内存存储的,它支持 [] 运算符,而 list 是以链表形式实现的,不支持 []。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List 对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要改变指针的指向就可以。原创 2023-04-17 14:32:10 · 759 阅读 · 0 评论 -
C++经典面试题之深入解析带虚函数空类的内存大小
本文详细地分析了空类、虚函数、静态数据成员、普通成员函数、普通继承、虚拟继承等内存中分配中的大小,并分析其内存分配的原因和原理。原创 2023-04-17 16:50:36 · 793 阅读 · 0 评论 -
C++经典面试题之深入解析智能指针unique_ptr的实现原理与自定义实现
unique_ptr 独享它指向的对象,也就是说,同时只有一个 unique_ptr 指向同一个对象,当这个 unique_ptr 被销毁时,指向的对象也随即被销毁。这也是它和 shared_pt r不一样的地方,它不需要做引用计数,也不可以被第二个人引用,只有它自己。unique_ptr 作为一个类的成员变量,这个变量只在本类使用,不会被赋值给其他类,也不会作为参数传递给某个函数;在一个函数作为局部变量,使用完就不用再管,函数结束,自动释放托管资源。原创 2023-04-18 10:32:21 · 2096 阅读 · 0 评论
分享