莫名一个3秒的卡顿
当点击tabbarController的最后一个bar时,页面迟迟不切换过去,看console有部分打印信息正好是随着点击
到切换成功
,看看时间差,足足3秒多才切换过去
2019-10-26 15:03:41.371817+0800 yestin[281:7024] -[BaseNavigationController setNavigationBarHidden:animated:]
------- 0
warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.
2019-10-26 15:03:44.517337+0800 yestin[281:7231] -[PicDraftManager readInfo]
-------
1、打开instrument,使用time profile
打开app
结果发现一切正常,秒切啊... 这...坑我呢
2、console的log比较多,怀疑是NSLog导致的
于是条件编译屏蔽一下NSLog
#if ALLOW_NSLOG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...)
#endif
然而并不是,依然卡顿那么久
3、搜了搜ios ,tabbarController点击 跳转 卡顿
❌ TabBarController下NavigationController跳转回RootView卡顿
一看这些个该是我所遭遇的情况了吧,but...一个个被我排除/❌ , 哎,继续研究吧
4、逼我使用runloop监听了
参考Tencent的GYMonitor,or戴铭的GCDFetchFeed (从中摘取SMLagMonitor
)
结果把
SMLagMonitor
拖到空工程没事,拖到项目工程里就报错. 难题一个! 单独写fix过程,看这篇While building module 报错
/Users/dl/Desktop/gitFiles/DearBaby/yestin/yestin/Expand/Macro/UIkitMacro.h:10:9: While building module 'UIKit' imported from /Users/dl/Desktop/gitFiles/DearBaby/yestin/yestin/Expand/Macro/UIkitMacro.h:10:
>
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:9: While building module 'Foundation' imported from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8:
>
/Users/dl/Desktop/gitFiles/DearBaby/yestin/<module-includes>:1:10: In file included from <module-includes>:1:
>
Showing All Errors Only
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:9: In file included from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.4.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:8:
成功用上SMLagMonitor
之后
打印出一个耗时堆栈
-[SMLagMonitor beginMonitor]_block_invoke_2
------- Stack of thread: 771:
CPU used: 46.0 percent
user time: 0 second
CoreFoundation 0x180ea08cc <redacted> + 0
UIKit 0x18abf1b9c <redacted> + 1140
yestin 0x1008d7bfc -[UITableView(MJRefresh) mj_reloadData] + 28
yestin 0x1007c17b0 __62-[BaseRefreshTableViewController r_requestDataComplete:error:]_block_invoke + 260
yestin 0x10068bacc __58-[UserCenterViewController requestDataComplete:errorInfo:]_block_invoke + 612
yestin 0x1007964ec __72+[CHRequestManager(Account) requestUserInfoWithUid:onSucceeded:onError:]_block_invoke + 148
yestin 0x1007a21f8 __62+[CHRequestManager request:method:parameters:success:failure:]_block_invoke + 360
yestin 0x1007fba58 __61-[CHBaseRequest startWithCompletionBlockWithSuccess:failure:]_block_invoke + 432
yestin 0x100a15590 __48-[YTKNetworkAgent requestDidSucceedWithRequest:]_block_invoke + 216
libdispatch.dylib 0x10821d1dc _dispatch_call_block_and_release + 24
libdispatch.dylib 0x10821d19c _dispatch_client_callout + 16
libdispatch.dylib 0x108221d2c _dispatch_main_queue_callback_4CF + 1180
CoreFoundation 0x180ec3070 <redacted> + 12
CoreFoundation 0x180ec0bc8 <redacted> + 2272
CoreFoundation 0x180de0da8 CFRunLoopRunSpecific + 552
GraphicsServices 0x182dc6020 GSEventRunModal + 100
UIKit 0x18ae00758 UIApplicationMain + 236
yestin 0x1007c6e98 main + 88
libdyld.dylib 0x180871fc0 <redacted> + 4
是这个requestUserInfoWithUid
请求太慢的缘故?去掉这个后,发现仍然卡顿
继续查看其它卡顿堆栈
可能SMLagMonitor
不太准吧,运行多次,经常是不同的堆栈如下, 出现以下经搜索和验证后不在因素范围内的东东
libsystem_malloc.dylib
// 这个明显搜不到与卡顿相关的
libobjc.A.dylib
// 这个倒能搜到与卡顿相关的,但我试了不行
...
后来我打印卡顿界面的appear方法调用时间,于是搜索 willappear 和 didAppear之间 卡顿了好几秒
这个和我一样卡顿好几秒的,但最后我的不属于这种情况,仍要继续探究
5、删代码,一步步排除吧
结果,当我使用如下结构作为window的rootViewController时
UITabBarController
| - UINavigationController
|- UIViewController
| - UINavigationController
|- UIViewController
| - UINavigationController
|- UITableViewController
只要第三个tabbar的nav的rootVC
orvc
是UITableViewController or 添加了tableView的UIViewController ,当启动后第一次点击第3个tabbar就会卡顿好几秒才跳转成功。
但是我新建一个工程,这样写就没有问题。
难道是因为一些与VC/NavVC/UIScrollView相关的方法交换导致? 我试着都删除,仍然无解。至此研究了快一天了吧。
研究不透,那只能以尽快解决问题为目的,回滚代码排查了
6、回滚
回滚到上周末的代码,build报错根据提示pod后发现依然无法运行
SDWebImageCompat.h' file not found
于是查查SDWebImage
发现当初为引入阿里云的sdk,参照的阿里云demo这样pod的
## 阿里云视频
# 视频录制
pod 'MBProgressHUD', '~> 1.1.0'
pod 'AFNetworking', '~> 3.0'
pod 'SDWebImage', '~> 4.0'
pod 'FMDB', '~> 2.5'
pod 'JSONModel'
pod 'LXReorderableCollectionViewFlowLayout'
pod 'Nama-lite', '5.3.0'
pod 'ZipArchive','1.4.0'
pod 'AlivcConan', '0.9.5.1' #短视频SDK依赖的数据埋点
# pod 'AliyunVideoSDKPro' #短视频SDK(已经手动导入)
问题就出在pod 'SDWebImage', '~> 4.0'
,因为我把之前的pod 'SDWebImage', '~> 5.0.6'
给删除了,无脑直接copy了pod 'SDWebImage', '~> 4.0'
✔️ 于是改回pod 'SDWebImage', '~> 5.0.6'
发现这样改之后,run,一顿操作,卡顿消失,简直不敢相信,再run,再测,感动人心时候终于来了,哈哈哈哈哈哈..... 累了一天后终于舒了一口气,
心酸的一天... 焦躁的一天... 请有同样卡顿的同学,不要像我这么自虐的走研究卡顿的路线,直接跳到最后一步回滚
代码,解决bug,先解决再研究。
但看到这样的解决方式,我也不想再继续研究下去了。有心得的同学,帮忙留言告诉声哈 ~
网友评论