美文网首页从七开始——正则表达式专题
iOS通知/KVO移除 自动检测脚本

iOS通知/KVO移除 自动检测脚本

作者: 肠粉白粥_Hoben | 来源:发表于2020-04-28 15:20 被阅读0次

零. 前言

在iOS开发过程中,如果增加了KVO和通知,需要在销毁时候及时移除掉,不然的话就有可能会崩溃。为了避免同事们开发过程中忘记remove,需要写个脚本,在编译时自动监测是否有移除,将崩溃扼杀于开发阶段中。

本次脚本实现依然基于正则,去检测一个文件是否同时存在(添加通知和移除通知)、(添加KVO和移除KVO),如果只添加不移除就会报错。

一. 通知的检测

通知的通用创建为:[[NSNotificationCenter defaultCenter] addObserver:(weak)self(.param) selector:...],由于工程中加了个宏NOTIFICATION_CENTER,因此需要检测以上两种格式,得正则:

(?:\[NSNotificationCenter\s*defaultCenter\]|NOTIFICATION_CENTER)\s*?addObserver:\s*?.*?[sS]elf(.*?)\s+?selector:

通知的通用移除为:[[NSNotificationCenter defaultCenter] removeObserver:(weak)self(.param) ....],得正则:

observer = '.*?[sS]elf' + param # 这里的param是指上面添加方法的参数

(?:\[NSNotificationCenter\s*?defaultCenter\]|NOTIFICATION_CENTER)\s*?removeObserver:\s*? + observer + r'(?:\s*name:.*?)?(?:\s*object:.*?)?\s*?\]'

如果创建能匹配,移除不能匹配,则视为没有被移除,从而报错。

二. KVO的检测

KVO的通用创建为:[xxx addObserver:(weak)self(.param) forKeyPath:xxx options:.....],则可以通过以下正则检测:

addObserver:\s*.*?[sS]elf(.*?)\s+?forKeyPath:\s*(.+?)\s+?options:

KVO的通用移除为:[xxx removeObserver:(weak)self(.param) forKeyPath:....],则可以通过以下正则检测,其中param和keypath为上述正则的匹配结果:

observer = '.*?[sS]elf' + param

'removeObserver:\s*' + observer + '\s+?forKeyPath:\s*' + keypath

如果创建能匹配,移除不能匹配,则视为没有被移除,从而报错。

三. 测试样例

- (void)dealloc {
    
    [NOTIFICATION_CENTER removeObserver:self];

    [NOTIFICATION_CENTER removeObserver:self.params];
    
    [test3 removeObserver:self forKeyPath:@"kvo_test1"];
    
    [test4 removeObserver:self forKeyPath:@"kvo_test2"];
    
    [test5 removeObserver:self.params forKeyPath:@"kvo_test1"];
    
}

- (void)setup2 {
    [NOTIFICATION_CENTER addObserver:self selector:@selector(test1) name:@"noti_test1" object:nil];
    
    [NOTIFICATION_CENTER addObserver:self.params selector:@selector(test2) name:@"noti_test2" object:nil];
    
    [test3 addObserver:self forKeyPath:@"kvo_test1" options:nil context:nil];
    
    [test4 addObserver:self forKeyPath:@"kvo_test2" options:nil context:nil];
    
    [test5 addObserver:self.params forKeyPath:@"kvo_test1" options:nil context:nil];

}

dealloc删掉任意一行代码都会报错。

相关文章

  • iOS通知/KVO移除 自动检测脚本

    零. 前言 在iOS开发过程中,如果增加了KVO和通知,需要在销毁时候及时移除掉,不然的话就有可能会崩溃。为了避免...

  • 事半功倍——正则表达式由浅入深 及 iOS实战

    零. 前言 在前面写的三篇文章:iOS分类 同名方法自动检测脚本、iOS瘦身——移除无用资源的LSUnusedRe...

  • iOS 如何自动移除KVO观察者

    iOS 如何自动移除KVO观察者

  • ARC下-dealloc方法

    ARC下,覆写-dealloc方法: (void)dealloc { // 移除通知中心的监听// 移除KVO监听...

  • KVO学习笔记

    1.KVO初探学习2.KVO 底层原理探索 1.KVO初探学习 移除观察者的重要性 (IOS11之后说不移除是不对...

  • iOS LocalNotification 相关

    iOS 10 以下系统: 1. 添加通知: 2. 移除通知: 3. 移除全部还未触发的通知: iOS 10以上版本...

  • 03--KVC/KVO本质05--KVO 本质

    [TOC] (一)KVO 初探 1. 基本用法 添加观察 监听观察 移除观察 通知使用完之后,一定要移除,否则会有...

  • iOS 通知

    iOS 通知传参使用方法 尽量不要在viewWillDisappear:方法中移除通知 iOS通知传值的使用 1、...

  • iOS通知的添加

    iOS创建添加通知、发送通知、移除通知[https://www.jianshu.com/p/1c022825150...

  • iOS 通知

    要了解通知、KVO、代理的区别,合理利用。 [A]通知是什么: 通知(NSNotification)是iOS的一种...

网友评论

    本文标题:iOS通知/KVO移除 自动检测脚本

    本文链接:https://www.haomeiwen.com/subject/wznmwhtx.html