![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
重学OC系列
文章平均质量分 96
主要记录OC方面的一些知识,加深理解和复习。
竹子与牛
iOS开发
展开
-
重学OC第二十六篇:RunLoop
文章目录前言一、RunLoop文档解析1.1 Modes1.2 Sources1.2.1 Input Sources1.2.2 Timer Sources1.3 Observers1.4 事件执行顺序1.5 何时使用RunLoop二、RunLoop源码解析总结前言RunLoop有一篇ibireme写的深入理解RunLoop,虽然文中RunLoop内部逻辑那张图有些许错误,但确实是一篇好文章,早年看时很多地方不太理解,但确实对我理解RunLoop有帮助。本篇主要是对官方文档和CFRunLoop源码的学习原创 2021-01-05 01:21:23 · 181 阅读 · 0 评论 -
重学OC第二十四篇:启动优化
文章目录前言一、冷启动1.1 性能检测1.2 优化二、二进制重排2.1 原理2.1.1 PageFault检测2.2 重排2.2.1 二进制符号顺序查看2.2.2 通过.order文件重排2.2.3 clang插桩前言启动分为冷启动和热启动,主要区别是内存是否有APP加载的数据,如果所有的数据需从硬盘读取后加载到内存,那就为冷启动。下面主要是关于冷启动方面的优化。一、冷启动1.1 性能检测APP启动分两个阶段来测试:main函数前(pre-main)主要是dyld流程部分,包括动态库加载原创 2020-11-24 00:41:26 · 1002 阅读 · 0 评论 -
重学OC第二十三篇:block
文章目录一、Block是什么?1.1 __block二、Block源码分析一、Block是什么?int main(int argc, const char * argv[]) { int a = 0; void (^aBlock)(void) = ^{ NSLog(@"%d", a); }; aBlock();}用clang转为cppBlock是带有自动变量(局部变量)的匿名函数,但在OC中Block本质上就是一个对象(__main_block_impl_0结构体类比obj原创 2020-11-14 00:54:09 · 697 阅读 · 0 评论 -
重学OC第二十一篇:@synchronized分析
文章目录一、clang分析@synchronized二、objc_sync_enter()源码解析2.1 id2data()函数分析三、objc_sync_exit源码总结一、clang分析@synchronizedint main(int argc, const char * argv[]) { NSObject *obj = [[NSObject alloc] init]; @synchronized (obj) { } return 0;}通过clang -re原创 2020-11-07 22:01:44 · 1299 阅读 · 0 评论 -
重学OC第十九篇:GCD概要及API简介
文章目录一、什么是GCD?二、GCD的API1.1三、GCD实现总结一、什么是GCD?Grand Central Dispatch(GCD)是异步执行任务的技术之一。通常,应用程序中编写的线程管理用的代码要在系统级实现,开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。二、GCD的API1.1三、GCD实现总结...原创 2020-11-05 19:23:41 · 272 阅读 · 0 评论 -
重学OC第十八篇:进程与线程
文章目录前言一、进程内存区域分布1.1 栈溢出、栈桢二、线程2.1 线程访问权限2.2 线程调度与优先级2.3 线程池2.4 iOS线程栈大小2.5 iOS多线程技术方案总结前言先来简单了解一下进程和线程进程是一个执行中程序的实例(操作系统对一个正在运行的程序的一种抽象)。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件,而并发运行,则是是说一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。线程是进程的基本执行单元,一个进程的所有任务都在原创 2020-11-03 22:04:52 · 300 阅读 · 0 评论 -
重学OC第十六篇:KVO使用与实现机制分析(上)
目录原创 2020-10-28 18:28:08 · 248 阅读 · 0 评论 -
重学OC第十四篇:类的扩展&关联对象
目录原创 2020-10-25 01:56:36 · 192 阅读 · 0 评论 -
重学OC第十五篇:KVC
KVCKVC简介一、键值编码基础1.1 访问对象属性1.2 访问集合属性1.3 使用集合运算符1.4 表示非对象值。1.5 属性验证(仅OC)二、KVC访问器搜索模式2.1 基础Getter(valueForKey:)2.2 基础Setter(setValue:forKey:)2.3 可变数组( mutableArrayValueForKey:)2.4 可变有序集合(mutableOrderedSetValueForKey:)2.5 可变集合(mutableSetValueForKey:)总结KVC简介原创 2020-10-24 14:27:05 · 316 阅读 · 0 评论 -
重学OC第十三篇:类的加载(下)
分类的加载一、分类的本质二、分类加载2.1 方式一2.2 方式二2.3 attachCategories方法源码总结一、分类的本质通过clang命令把分类的.m转为c++的.cpp可从中得出_category_t的结构体,对应于objc源码为struct category_t { const char *name; //分类名 classref_t cls; //归属的类 struct method_list_t *instanceMethods; //分类中的实原创 2020-10-23 19:31:32 · 225 阅读 · 0 评论 -
重学OC第十二篇:类的加载(中)
文章目录原创 2020-10-23 15:11:04 · 165 阅读 · 0 评论 -
重学OC第十一篇:类的加载(上)
文章目录原创 2020-10-17 11:54:18 · 167 阅读 · 0 评论 -
重学OC第十篇:dyld加载
文章目录一、dyld简介二、dyld加载过程分析总结一、dyld简介二、dyld加载过程分析总结原创 2020-09-28 02:46:44 · 484 阅读 · 0 评论 -
重学OC第九篇:消息转发
文章目录前言一、查看消息转发流程方法1.1 反汇编法1.2 打印日志法二、消息转发流程及简介2.1 消息转发流程图2.2 消息转发函数2.2.1 forwardingTargetForSelector(快速转发)2.2.1.1 实例方法简介2.2.1.2 实例方法简单使用2.2.2 methodSignatureForSelector和forwardInvocation(慢速转发)2.2.2.1 实例方法简介2.2.2.2 实例方法简单使用总结前言在上一篇中, 一顿乱操作跟到了__forwarding_原创 2020-09-25 00:36:28 · 209 阅读 · 0 评论 -
重学OC第八篇:方法查找(下)
目录前言一、lookUpImpOrForward源码解析二、_objc_msgForward_impcache总结前言在上一篇中,当缓存中方法找不到后,会调用_lookUpImpOrForward,从注释中可以看到是调用的lookUpImpOrForward方法,可以全局搜索找,也可以跟着断点找到lookUpImpOrForward在objc-runtime-new.mm中的源码。一、lookUpImpOrForward源码解析/**标准的IMP查找。*没有LOOKUP_INITIALIZE:尝原创 2020-09-23 00:57:26 · 301 阅读 · 3 评论 -
重学OC第七篇:方法查找(上)--汇编实现
目录前言一、objc_msgSend二、objc_msgSendSuper总结前言OC的方法调用用clang转为c++后就是调用objc_msgSend,在objc源码中搜索objc_msgSend在message.h文件中只了找到声明OBJC_EXPORT voidobjc_msgSend(void /* id self, SEL op, ... */ ) OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);OBJC_EXPORT voidobjc_ms原创 2020-09-21 00:18:17 · 307 阅读 · 0 评论 -
重学OC第六篇:类结构之cache
文章目录一、cache_t分析一、cache_t分析#if defined(__arm64__) && __LP64__#define CACHE_MASK_STORAGE CACHE_MASK_STORAGE_HIGH_16#elif defined(__arm64__) && !__LP64__#define CACHE_MASK_STORAGE CACHE_MASK_STORAGE_LOW_4#else#define CACHE_MASK_STORAGE原创 2020-09-18 17:31:02 · 198 阅读 · 0 评论 -
重学OC第五篇:属性关键字、方法归属、内省
文章目录一、属性关键字1 @property、@synthesize 和 @dynamic2 nonatomic、atomic3 readwrite、readonly4 strong、retain、weak、assign、copy、unsafe_unretained5 nullable、nonnull6 属性修饰符分析6.1 objc_getProperty与objc_setProperty6.2 TypeEncoding6.2.1 方法类型编码6.2.2 属性类型编码二、方法归属1 class_getIn原创 2020-09-16 15:47:23 · 218 阅读 · 0 评论 -
重学OC第四篇:类结构之bits
文章目录一、bits1. class_data_bits_t2.一、bits1. class_data_bits_t2.原创 2020-09-14 00:23:24 · 432 阅读 · 0 评论 -
重学OC第三篇:类结构之isa
isa一、Clang1. Clang是什么2. Clang的简单使用二、类的结构是什么?三、isa_t isa3.1 位域结构体3.1.1 什么是位域结构体3.1.2 ISA_BITFIELD各参数解释3.2 isa的作用一、Clang1. Clang是什么Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下C/C++/Objective-C/ Objective-C++编译器。 2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这原创 2020-09-10 17:23:30 · 264 阅读 · 0 评论 -
重学OC第二篇:内存对齐
目录内存对齐1. 结构体内存对齐原则1.1在有#pragma pack宏的情况下1.2在没有#pragma pack宏的情况下2.操作系统内存对齐2.1 malloc、calloc、realloc2.2 calloc16字节对齐总结内存对齐1. 结构体内存对齐原则1.1在有#pragma pack宏的情况下结构体的自身宽度就是宏上规定的数值大小,所有内存都按照这个宽度去布局#pragma pack 参数只能是 ‘1’, ‘2’, ‘4’, ‘8’, ‘16’1.2在没有#pragma pack原创 2020-09-08 18:30:52 · 286 阅读 · 0 评论 -
重学OC第一篇:alloc流程初探
目录知识点1. hasCustomAWZ()2. instanceSize3. calloc4. initIsainitIsa5. new、alloc、alloc init对比5.1 编译器对alloc、alloc init等方法的优化调用总结知识点1. hasCustomAWZ()在类完成+initialize方法后,会调用_finishInitializing方法里的cls->setInitialized()来进行标记这个类完成了+initializedobjc_class::setI原创 2020-09-05 18:41:43 · 688 阅读 · 0 评论