小公司自己怎样做网站,网站seo诊断优化方案,永康营销型网站建设,吴桥钢结构网架公司文章目录 一、前言二、关于线程优先级反转三、优先级反转会造成什么后果四、怎么避免线程优先级反转五、使用信号量可能会造成线程优先级反转#xff0c;且无法避免六、延伸阅读#xff1a;iOS | Xcode中快速打开终端6.1 .sh绑定6.2 执行 pod install 脚本 七、延伸阅读… 文章目录 一、前言二、关于线程优先级反转三、优先级反转会造成什么后果四、怎么避免线程优先级反转五、使用信号量可能会造成线程优先级反转且无法避免六、延伸阅读iOS | Xcode中快速打开终端6.1 .sh绑定6.2 执行 pod install 脚本 七、延伸阅读Undefined symbol: _rebind_symbols || symbol(s) not found for architecture arm64八、延伸阅读 2 duplicate symbols for architecture arm64九、延伸阅读Xcode编译报错LLDB is likely reading from device memory to resolve symbols. 一、前言
应用Xcode 14.1进行项目编译时遇到以下错误提示导致APP线程暂停。
Thread running at QOS_CLASS_USER_INTERACTIVE waiting on a lower QoS thread running at QOS_CLASS_DEFAULT. Investigate ways to avoid priority inversions以上问题是由于iOS信号量造成线程优先级反转在并发队列使用信号量会可能会造成线程优先级反转。
经过查询资料发现是在XCode14上增加了工具比如
Thread Performance Checker XCode14上默认开启的这个工具会让APP在运行的时候发现有例如线程优先级反转和非UI工作在主线程上运行等问题的时候就会在XCode问题导航栏中提示该卡顿风险警告可以帮助我们在开发初期就能发现并解决隐含的卡顿风险问题这个不是崩溃如果不想要可以在 “Product - Scheme - Edit Scheme 的 Diagnostics 中去掉 Thread Performance Checker勾选”。 XCode14还有其他一些新增加的工具类可参考 iOS卡顿检测。
二、关于线程优先级反转
优先级反转Priority Inversion 指高优先级任务需要等待低优先级任务执行完成才能继续执行这种情况下优先级被反转了。
举例有三个线程分别为A、B、C。优先级A B C线程A和B处于挂起状态等待某一事件发生线程C正在运行此时任务C开始使用共享资源Source。在使用Source时线程A等待事件到来线程A转为就绪态因为线程A优先级比线程C高所以线程A会立即执行。当线程A要使用共享资源Source时由于共享资源Source正在被线程C使用因此线程A被挂起线程C开始运行。如果此时中等优先级线程B等待事件到来则线程B转为就绪态。由于线程B优先级比线程C高因此线程B开始运行直到其运行完毕线程C才开始运行。直到线程C释放共享资源Source后线程A才得以执行。在这种情况下优先级发生了翻转线程B先于线程A运行。
三、优先级反转会造成什么后果
低优先级的任务比高优先级的任务先执行导致任务的错乱逻辑错乱
可能造成系统崩溃
死锁优先级低的线程迟迟得不到调度具有高优先级的线程不能执行死锁
四、怎么避免线程优先级反转
如果当前线程因等待某线程上正在进行的操作如block1而受阻而系统知道block1的所在的目标线程系统会通过提高相关线程的优先级来解决优先级反转的问题 如线程A在尝试获取共享资源而被挂起的期间内将线程C的优先级提升到同线程A的优先级等线程C处理结束降回原优先级这样能防止C被B抢占。如果不知道block1所在的目标线程则无法知道应该提高谁的优先级也就无法解决反转的问题如信号量。
五、使用信号量可能会造成线程优先级反转且无法避免
QoS Quality of Service用来指示某任务或者队列的运行优先级 记录了持有者的api都可以自动避免优先级反转系统会通过提高相关线程的优先级来解决优先级反转问题如 dispatch_sync, 如果系统不知道持有者所在的线程则无法知道应该提高谁的优先级也就无法解决反转问题。 慎用dispatch_semaphore 做线程同步。dispatch_semaphore 容易造成优先级反转因为api没有记录是哪个线程持有了信号量所以有高优先级的线程在等待锁的时候内核无法知道该提高那个线程的优先级QoS dispatch_semaphore 不能避免优先级反转的原因在调用dispatch_semaphore_wait() 的时候系统不知道哪个线程会调用 dispatch_semaphore_signal()方法系统无法知道owner信息无法调整优先级。dispatch_group 和semaphore类似在调用enter()方法的时候无法预知谁会leave()所以系统也不知道owner信息。
六、延伸阅读iOS | Xcode中快速打开终端
在 AndroidStudio、Goland 等 JetBrains IDEA 一系的代码编辑器中界面底部有一个 Terminal 选项卡。打开选项卡会创建一个 Terminal并自动切换到当前项目的根目录下然后我们就可以在此快速的执行一些命令操作。如下图 然而用于 iOS 开发的 Xcode 中并没有该选项卡这就很不方便了。接下来讲解如何手动为 Xcode 配置一个 Terminal 的快捷入口。
6.1 .sh绑定
步骤1新建 xcode-terminal.sh 脚本文件
切换到任意目录然后新建一个 xcode-terminal.sh 的脚本文件并编辑其内容。
脚本内容如下
#!/bin/shif [ -n $XcodeProjectPath ]; then open -a Terminal $XcodeProjectPath/..
elseopen -a Terminal $XcodeWorkspacePath/..
fi另外.sh 前面的文件名称可以自定义但是下面步骤2中修改权限时名称必须一致。
步骤2修改文件执行权限
打开终端并在其中执行如下命令
chmod x 路径名/.sh文件名如: chmod x xcode-terminal.sh
步骤3脚本命令添加到 Xcode 中
依次打开 Xcode menu Behaviors Edit Behaviors…,
然后点击下图左下角的 : 然后输入自定义的 Behavior 名称对应上图中的 2并指定一个快捷键对应上图中的3。
然后勾选上图右侧的 Run对应上图中的4, 并双击 Run 右侧的下拉框对应上图中的 5 指定该 Behavior 对应的脚本文件——也就是刚才创建的 xcode-terminal.sh。
至此配置完成。在 Xcode 编辑器中按下自定义的快捷键就可以调出终端了。
6.2 执行 pod install 脚本
脚本内容如下
#!/bin/sh
# 改脚本用于Xcode 执行快捷键执行 pod install path
if [ -n $XcodeProjectPath ]; thenpath$XcodeProjectPath
elsepath$XcodeWorkspacePath
fi
# 执行 AppleScript 打开 Terminal 进行 podinstall
osascript EOFtell application Terminalactivatedo script with command cd \$path\/..;pod installend tell
EOF总结 任意需求都可以通过脚本实现然后可以将其关联到 Xcode 的 behavious 中并为其关联快捷键。
七、延伸阅读Undefined symbol: _rebind_symbols || symbol(s) not found for architecture arm64
xcode 14 给出如下错误提示信息
Undefined symbols for architecture arm64:_rebind_symbols, referenced from:___32[RCTReconnectingWebSocket load]_block_invoke in libReact-RCTWebSocket.a(RCTReconnectingWebSocket.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)解决方案
清理Xcode缓存
rm -rf ~/Library/Developer/Xcode/DerivedData/2清理CocoaPods缓存
切换到项目ios目录下执行以下命令。
rm -rf ${HOME}/Library/Caches/CocoaPods
rm -rf pwd/Pods/
pod update若执行 pod update 命令报错则执行以下命令
cd ..
pod install --project-directoryios最后将Build Active Architectures Only 设置为NO。
八、延伸阅读 2 duplicate symbols for architecture arm64
编译阶段错误提示信息如下
duplicate symbol _OBJC_CLASS_$_Orientation in:/Users/ccms-m-03/Library/Developer/Xcode/DerivedData/mrcs-erictiduzoziyxgpkngocqfejvjq/Build/Intermediates.noindex/mrcs.build/Debug-iphoneos/mrcs.build/Objects-normal/arm64/Orientation.o/Users/ccms-m-03/Library/Developer/Xcode/DerivedData/mrcs-erictiduzoziyxgpkngocqfejvjq/Build/Products/Debug-iphoneos/react-native-orientation/libreact-native-orientation.a(Orientation.o)
duplicate symbol _OBJC_METACLASS_$_Orientation in:/Users/ccms-m-03/Library/Developer/Xcode/DerivedData/mrcs-erictiduzoziyxgpkngocqfejvjq/Build/Intermediates.noindex/mrcs.build/Debug-iphoneos/mrcs.build/Objects-normal/arm64/Orientation.o/Users/ccms-m-03/Library/Developer/Xcode/DerivedData/mrcs-erictiduzoziyxgpkngocqfejvjq/Build/Products/Debug-iphoneos/react-native-orientation/libreact-native-orientation.a(Orientation.o)
ld: 2 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)解决方案根据提示搜索重复文件Orientation。
若存在重复文件则删掉一个。 此外也可以通过以下步骤检查 首先排查是否有名字重复的文件。查看下自己的项目中创立的文件名和引入的第三方文件名是否重复。 检查是否在#import头文件的时候不小心把.h写成了.m可以全局搜索是否是这个问题. 仔细在报错的类中找下是否有重复添加 .h头文件。
九、延伸阅读Xcode编译报错LLDB is likely reading from device memory to resolve symbols.
ios应用在本地热部署启动过程中控制台给出以下提示信息
Launching “**” is taking longer than expected. Do you want to continue to wait?
LLDB is likely reading from device memory to resolve symbols.问题分析 大概意思是编译时间会比预期的要长是否继续等待。主要是新操作系统和Xcode旧版的架构不匹配造成的。
解决方案 通过访达“前往文件夹”功能输入~/Library/Developer/Xcode/进入iOS DeviceSupport目录删除该真机对应的架构文件比如iOS15.1就删除iOS15.1的架构文件退出Xcode拔掉手机重新连接打开Xcode解决。
如果上面方案不行选择Xcode-Window-Devices and Simulatorscommandshift2鼠标右键点击真机设备选择Unpair Device。解除信任然后重新拔插手机重新信任重启Xcode。