
Objective-C runtime 漫游指南
文章平均质量分 95
以runtime源码为线索,带你逐步分析OC语言背后的实现机制。运用图文的方式,深入探究OC语言的实现原理。你将了解到:OC类对象数据结构、内存引用计数、KVO、分类扩展、消息调用背后的秘密。
slunlun
这个作者很懒,什么都没留下…
展开
-
Objective-C runtime机制(前传)——Mach-O格式
Mach-OMach-O是Mach Object文件格式的缩写。它是用于可执行文件,动态库,目标代码的文件格式。作为a.out格式的替代,Mach-O格式提供了更强的扩展性,以及更快的符号表信息访问速度。Mach-O格式为大部分基于Mach内核的操作系统所使用的,包括NeXTSTEP, Mac OS X和iOS,它们都以Mach-O格式作为其可执行文件,动态库,目标代码的文件格式。具体...原创 2018-05-21 22:28:50 · 3527 阅读 · 2 评论 -
Objective-C runtime机制(前传2)——Mach-O格式和runtime
在前传1中,我们分析了解了XNU内核所支持的二进制文件格式Mach-O。同时还留了一个小尾巴,就是Mach-O文件中和Objective-C以及runtime相关的Segment section。今天,就来了解一下它们。OC之源起我们知道,程序的入口点在iOS中被称之为main函数:#import <UIKit/UIKit.h>#import &am原创 2018-05-25 16:20:55 · 2624 阅读 · 0 评论 -
Objective-C runtime机制(1)——基本数据结构:objc_object & objc_class
前言从本篇文章开始,就进入runtime的正篇。什么是runtime?OC是一门动态语言,与C++这种静态语言不同,静态语言的各种数据结构在编译期已经决定了,不能够被修改。而动态语言却可以使我们在程序运行期,动态的修改一个类的结构,如修改方法实现,绑定实例变量等。 OC作为动态语言,它总会想办法将静态语言在编译期决定的事情,推迟到运行期来做。所以,仅有编译器是不够的,它需要...原创 2018-05-30 10:06:22 · 7461 阅读 · 3 评论 -
Objective-C runtime机制(2)——消息机制
当我们用中括号[]调用OC函数的时候,实际上会进入消息发送和消息转发流程: 消息发送(Messaging),runtime系统会根据SEL查找对用的IMP,查找到,则调用函数指针进行方法调用;若查找不到,则进入消息转发流程,如果消息转发失败,则程序crash并记录日志。SELSEL被称之为消息选择器,它相当于一个key,在类的消息列表中,可以根据这个key,来查找到对应的消息实现...原创 2018-06-04 18:04:48 · 3429 阅读 · 3 评论 -
Objective-C runtime机制(3)——method swizzling
方法替换,又称为method swizzling,是一个比较著名的runtime黑魔法。网上有很多的实现,我们这里直接讲最正规的实现方式以及其背后的原理。Method Swizzling在进行方法替换前,我们要考虑两种情况:要替换的方法在target class中有实现要替换的方法在target class中没有实现,而是在其父类中实现对于第一种情况,很简单,我们直接调用me...原创 2018-06-06 18:18:48 · 1965 阅读 · 1 评论 -
Objective-C runtime机制(4)——深入理解Category
在平日编程中或阅读第三方代码时,category可以说是无处不在。category也可以说是OC作为一门动态语言的一大特色。category为我们动态扩展类的功能提供了可能,或者我们也可以把一个庞大的类进行功能分解,按照category进行组织。关于category的使用无需多言,今天我们来深入了解一下,category是如何在runtime中实现的。category的数据结构cate...原创 2018-06-11 15:21:24 · 2745 阅读 · 1 评论 -
Objective-C runtime机制(5)——iOS 内存管理
概述当我们创建一个对象时:SWHunter *hunter = [[SWHunter alloc] init];上面这行代码在栈上创建了hunter指针,并在堆上创建了一个SWHunter对象。目前,iOS并不支持在栈上创建对象。iOS 内存分区iOS的内存管理是基于虚拟内存的。虚拟内存能够让每一个进程都能够在逻辑上“独占”整个设备的内存。关于虚拟内存,可以参考这里。iOS...原创 2018-06-25 14:54:33 · 8255 阅读 · 16 评论 -
Objective-C runtime机制(6)——weak引用的底层实现原理
前言提起弱引用,大家都知道它的作用:(1)不会添加引用计数 (2)当所引用的对象释放后,引用者的指针自动置为nil那么,围绕它背后的实现,是怎么样的呢?在许多公司面试时,都会问到这个问题。那么,今天就带大家一起分析一下weak引用是怎么实现的,希望能够搞清楚每一个细节。Store as weak当我们要weak引用一个对象,我们可以这么做:int main(int argc, char...原创 2018-09-20 15:45:15 · 6157 阅读 · 0 评论 -
Objective-C runtime机制(7)——SideTables, SideTable, weak_table, weak_entry_t
在runtime中,有四个数据结构非常重要,分别是SideTables,SideTable,weak_table_t和weak_entry_t。它们和对象的引用计数,以及weak引用相关。关系先说一下这四个数据结构的关系。 在runtime内存空间中,SideTables是一个64个元素长度的hash数组,里面存储了SideTable。SideTables的hash键值就是一个对象obj的ad...原创 2018-10-11 18:04:40 · 13799 阅读 · 2 评论 -
Objective-C runtime机制(8)——OC对象从创建到销毁
在我们前面的几章中,分析了OC的runtime一些底层的数据结构以及实现机制。今天,我们就从一个OC对象的生命周期的角度,来解析在runtime底层是如何实现的。我们创建一个对象(或对象引用)有几种方式?Student *student = [[Student alloc] init];Student *student2 = [Student new];__weak Student *w...原创 2019-01-22 15:04:12 · 3512 阅读 · 0 评论 -
Objective-C runtime机制(9)——main函数前发生了什么
在我们的App代码中,程序的入口点是int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}而对于runtime来说,其入口函数是vo...原创 2019-01-25 15:35:48 · 2914 阅读 · 0 评论 -
Objective-C runtime机制(10)——KVO的实现机制
使用KVO自动触发KVO在平日代码中,我们通过KVO来监视实例某个属性的变化。比如,我们要监视Student 的 age属性,可以这么做:@interface Student : NSObject@property(nonatomic, strong) NSString *name;@end@interface ViewController ()@end@implement...原创 2019-02-21 17:33:56 · 1826 阅读 · 1 评论 -
Objective-C runtime机制(11)——结业考试
试分析如下代码#import <UIKit/UIKit.h>@interface Student : NSObject@property(nonatomic, strong) NSString *name;@property(nonatomic, strong) NSNumber *age;@end@interface Sark : NSObject@propert...原创 2019-12-31 11:46:31 · 1693 阅读 · 5 评论 -
APP Launch 优化
本文将探讨一下对于APP Launch的相关概念以及影响Launch的因素及优化方法。原创 2021-12-14 16:52:21 · 3321 阅读 · 0 评论