Tag Archives: 底层原理

利用RunLoop来实现线程的保活,并封装子线程任务执行

1、基本思路

1.1、创建一个Helper类对NSThread类进行封装;
1.2、Helper类内部实现线程的创建、执行、销毁等一系列操作;
1.3、核心点在于RunLoop的循环执行,调用runMode:beforeDate方法让线程处于休眠状态,再通过while循环,使runloop执行结束后再次开启,循环条件外部控制,这样就能达到控制runloop的生命周期,从而保全线程的生命周期;
1.4、Helper类在销毁时,要及时更改runloop的循环条件,并唤醒或停止子线程中的runloop,runloop停止后线程结束,否则两者会一直存在内存当中,runloop因为没有及时被唤醒而一直处于休眠状态,线程因为runloop没有停止而无法释放;
1.5、Helper在使用NSThread创建子线程时也要注意循环引用的问题;

2、代码示例[……]

继续阅读

利用runtime拦截系统类对象方法调用

1
2
3
4
5
6
7
8
9
10
#import "ViewController.h"
#import 
 
 
@interface NSMutableArray (SA)
@end
@implementation NSMutableArray (SA)
+ (void)load
{
    static dis[......]<p class="read-more"><a href="https://www.yusian.com/blog/project/2018/11/23/0906261409.html">继续阅读</a></p>

使用Runtime动态创建一个类

关键代码:

1
2
3
4
5
6
7
8
9
10
#import "ViewController.h"
#import 
 
@interface ViewController ()
@end
 
@implementation ViewController
- (void)viewDidLoad
{
    [supe[......]<p class="read-more"><a href="https://www.yusian.com/blog/project/2018/11/23/0903501405.html">继续阅读</a></p>

Objective-C消息发送机制原理objc_msgSend( )

0、方法调用原理
0.1、以[reciver method]为例,实际上是objc_msgSend(reciver, @selector(method), …argments);
0.2、OC方法调用转换为objc_msgSend函数调用,方法调用者、方法名为该函数的前2个参数;
0.3、OC对象本质为结构体,参考:剖析Objective-C对象本质结构MJClassInfo

1、消息发送(查找方法)
1.1、如果方法调用者为nil,直接返回(不报错);
2.2、方法调用者通过isa指针查找方法接收者,方法接收者查找对象中的cache,如果没有则查找对象中方法列表class_rw_t;
2.3、如果找到则调用并缓存在cache中,否则通过superclass在父类中的cache,class_rw_t中查找;
2.4、如果找到则调用并缓存在cache中,否则再通过superclass的superclass查找,直到superclass为空;
2.5、如果在整个继承体系中都没有找到目标方法,调用方法接收者的动态解析方法(如果解析过则进入方法转发);

2、动态解析[……]

继续阅读