最后
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。
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/sh
if [ -n "$XcodeProjectPath" ]; then
open -a Terminal "$XcodeProjectPath"/..
else
open -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" ]; then
path=$XcodeProjectPath
else
path=$XcodeWorkspacePath
fi
# 执行 AppleScript 打开 Terminal 进行 podinstall
osascript <<EOF
tell application "Terminal"
activate
do script with command "cd \"$path\"/..;pod install"
end 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
命令报错,则执行以下命令:
最后前端到底应该怎么学才好?
如果你打算靠自己摸索自学,那么你首先要了解学习前端的基本大纲,这是你将要学习的主要内容,理解以及掌握好这些内容,便可以找到一份初级的前端开发工作。你还需要有一套完整的前端学习教程,作为初学者最好的方式就是看视频教程学习,初学者容易理解接受。
不要选择买书学习,这样的方式没有几个人能学会,基本都是看不下去书,也看不懂书。如果喜欢看书的学弟,可以买一些经典的书籍作为辅助即可,主要还是以看教程为主。每天抽出固定几个小时学习,做好长期学习的准备。学习编程并不是每天光看视频,你学习编程最重要的目的是为了编写软件产品,提供给大众使用,所以用手写出代码实现功能才是我们要做的事情。