iOS摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。
开发Tips
Xcode统计耗时的几个小技巧
收集几个分析项目耗时的统计小技巧。
统计整体编译耗时
在命令行输入以下命令:
bash $ defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES
此步骤之后需要重启 Xcode 才能生效,之后我们可以在 Xcode 状态栏看到整个编译阶段的耗时。
关键阶段耗时统计
上面的耗时可能不够详细,Xcode 还提供了一个专门用于分析各阶段耗时的功能。
菜单栏:Product > Perform Action > Build with Timing Summary
此步骤会自动触发编译,耗时统计在编译日志导航的最底部。
其还对应一个 xcodebuild 参数-showBuildTimingSummary
,使用该参数,编译日志里也会带上个阶段耗时的统计分析。
Swift 耗时阈值设置
Swift 编译器提供了以下两个参数:
-Xfrontend -warn-long-function-bodies=<millisecond>
-Xfrontend -warn-long-expression-type-checking=<millisecond>
配置位置如下:
分别对应了长函数体编译耗时警告和长类型检查耗时警告。
一般这里输入 100 即可,表示对应类型耗时超过 100ms 将会提供警告。
Include of non-modular header inside framework module
在组件 Framework 化的时候,如果在 public 头文件引入了另一个未 Framework 化的组件(.a静态库)时就会触发该问题。报错日志提示 Framework 里包含了非 modular 的头文件,也就是说如果我们要做 Framework 化的话,其依赖的内容也都应该是 Framework 化的,所以这个过程应该是一个从底层库到高层逐步进行的过程。如果底层依赖无法轻易修改,可以使用一些别的手段绕过这个编译错误。
Build Settings 里搜索 non-modular,将以下Allow Non-modular Includes In Framework Modules
选项设置为 Yes。
该选项进对 OC 模块代码有作用,对于 Swift 的引用还需要加另外一个编译参数:-Xcc -Wno-error=non-modular-include-in-framework-module
。添加位置为:
注意这两处设置均是对项目的设置,而非组件库。另外这些方案均是临时方案,最好还是要将所有依赖库全部 modular 化。
那些Bug
解决 iOS 14.5 UDP 广播 sendto 返回 -1
整理编辑:FBY展菲
1. 问题背景
- 手机系统升级到 iOS 14.5 之后,UDP 广播发送失败
- 项目中老版本使用到 socket
- 项目中新版本使用 CocoaAsyncSocket
- 两种 UDP 发包方式都会报错 No route to host
报错具体内容如下:
sendto: -