Parsifal
Parsifal
可以直接订阅我们专题哈 [老司机周报 OCRunner 专题](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI2NTAxMzg2MA==&action=getalbum&album_id=1805530104417042433&scene=173&subscene=91&sessionid=1617869759&enterid=1617869763&from_msgid=2247489694&from_itemidx=1&count=3&nolastread=1#wechat_redirect)
Check this PR #14
@AironMore 有问题指的是哪些方面呢?关于Unrecognized Selector类型的防护,这里处理只是转发消息到一个特定的类。如果问题指的是被转发消息后出现的业务异常,那确实可能会有问题。
另外,再次声明下,这个repo只是网易防护方案的预演实现,代码写得比较混乱,可能还存在各种问题,不可用作正式工程项目。
嗯,这种情况下直接调用这个方法是不会有问题的。但你如果依赖这个返回值,再拿返回值去做一些业务逻辑的话,就可能会出现问题了。
有以下考虑: 1. 系统的类出错概率较小; 2. 系统的类中有部分都是依赖于消息转发机制的; 3. 对于比较常出错的系统类,可以提供黑白名单机制,加到防护列表中; 最后补充一下,其实demo里防护的只是mainBundle的类,对于pod中集成的是不做防护的,如果需要的话,可以使用以下方法: ```objc + (BOOL)isCustomClass:(Class)cls { ///var/containers/Bundle/Application/CB0D354B-DD08-4845-A084-A22FF01097FE/WYCrashDoctor_Example.app NSString *mainBundlePath = [NSBundle mainBundle].bundlePath; ///var/containers/Bundle/Application/CB0D354B-DD08-4845-A084-A22FF01097FE/WYCrashDoctor_Example.app/Frameworks/WYCrashDoctor.framework NSString *clsBundlePath = [NSBundle bundleForClass:cls].bundlePath; return cls && mainBundlePath && clsBundlePath...
@gratefulHeart 什么问题呢?
@gratefulHeart 哦,这个问题在 @gonghongxia 和我的评论里也说了。demo里是特地判断了是不是在main bundle里的类。如果你想测试系统类的,把判断代码去掉就好了。
目前并没有比较好的策略,只能根据实际情况调整,不过可以避免的是需要过滤掉占用大内存的对象,比如`UIImage`这些。这种类型的防护风险也比较大,一般不会直接在线上产品开启,可能会只针对部分设备开启。
@AironMore EXC_BAD_ACCESS这类Crash实际上是从Mach层抛出的,从安全角度来说,一旦这类错误发生,应该立即终止应用。所以能够采取的措施只能是去减少这种错误发生。除了规范代码外,目前能够用起来的也只能是延迟内存释放这种并不是很好的方案。但如果抱着钻研的态度来看这个问题的话,还可以有一种方案尝试,就是直接捕捉Mach层的异常。当然,这种捕获方式是在异常已经发生后再去捕获处理的,iOS App的Runloop会被停掉,需要手动启用一个Runloop来维持应用的生命周期。感兴趣的话,可以参考这篇博客——[Handling unhandled exceptions and signals](https://www.cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html).