Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.08k stars 1.38k forks source link

UIView+QMUIBorder的方法交换在子线程操作UI的crash #1191

Closed Jude5201 closed 3 years ago

Jude5201 commented 3 years ago

Bug 表现 问题的具体描述 全局断点崩溃在UIView+QMUIBorder.m的load方法里,控制台提示子线程操作UI,堆栈最后崩溃在方法交换里。 截图 Bug 现场的界面截图,或者 Xcode 控制台的错误信息截图,有问题的代码截图 截屏2021-01-26 12 19 22 截屏2021-01-26 12 21 45

如何重现

  1. ...[self showEmptyViewWithImage:UIImageMake(@"erro_img") text:@"" detailText:@"咦,网络断片了~" buttonTitle:@"刷新" buttonAction:@selector(reload:)];

  2. ...点击事件触发selector

预期的表现 正常情况下,应该是什么表现:正常执行reload方法 尝试在这里回到主线程进行方法交换,问题解决: 截屏2021-01-26 12 25 36

修改后代码如下: OverrideImplementation([UIView class], @selector(layoutSublayersOfLayer:), ^id(__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void)) { return ^(UIView selfObject, CALayer firstArgv) { dispatch_async(dispatch_get_main_queue(), ^{ // call super void (originSelectorIMP)(id, SEL, CALayer ); originSelectorIMP = (void ()(id, SEL, CALayer ))originalIMPProvider(); originSelectorIMP(selfObject, originCMD, firstArgv); ... selfObject.qmui_borderLayer.path = path.CGPath; });

其他信息

MoLice commented 3 years ago

你可以试试把 QMUI 那些代码注释掉,我猜应该也是一样的问题。是不是你的业务代码本身就没在主线程操作?