一句话笔记(41)(自动释放词)

2020-04-29  本文已影响0人  天空中的球

一句话笔记,某段时间内遇到或看到的某个可记录的点。

一、自动释放词的理解

可以先想想自动释放词的理解和印象

AutoreleasePoolPage 结构,所有的AutoreleasePoolPage对象通过双向链表的形式连接在一起
iOS程序运行 在主线程中注册了2个Observer 分别监听RunLoop
第一个Observer监听了kCFRunLoopEntry 会调用objc_autoreleasePoolPush
第二个Observer监听了kCFRunLoopBeforeWaiting 会调用objc_autoreleasePoolPop

笔记来源: iOS进阶四-自动释放池原理iOS 自动释放池ARC与MRC

二、怎样实现一个精确的NSTimer?

2.1不准的原因如下:
2.2 解决的方案:

三、 如何防止拦截潜在的崩溃

1、利用 Runtime方法交换技术,将系统方法替换成类添加的新方法。

具体可以看 NSObjectSafe 的处理,其中一个如下

+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        swizzleInstanceMethod([NSObject class], @selector(addObserver:forKeyPath:options:context:), @selector(hookAddObserver:forKeyPath:options:context:));
        swizzleInstanceMethod([NSObject class], @selector(removeObserver:forKeyPath:), @selector(hookRemoveObserver:forKeyPath:));
        swizzleInstanceMethod([NSObject class], @selector(methodSignatureForSelector:), @selector(hookMethodSignatureForSelector:));
        swizzleInstanceMethod([NSObject class], @selector(forwardInvocation:), @selector(hookForwardInvocation:));
    });
}

2、利用异常的捕获来防止程序的崩溃,并且进行相应的处理。

@try {
    // 可能会出现崩溃的代码
}
@catch (NSException *exception) {
    // 捕获到的异常exception
}
@finally {
    // 结果处理
}
上一篇 下一篇

猜你喜欢

热点阅读