作者: Vong_HUST
最近遇到一个 bug
,场景是这样的:
应用中有两个相机相关的页面,直播页和直播封面拍摄页(两个页面相机实例不是同一个),进入直播页时,设置了 preset1(16:9)
,点击进入封面拍摄,会使用 preset2(4:3)
。如果直播页和封面拍摄页的摄像头位置一致,从封面拍摄页返回到直播页时,会导致相机输出的画面内容变形。后面断点查看,在摄像头位置一致的情况下,从封面拍摄页返回到直播页时,直播页 AVCaptureSession
的 preset
变为了 AVCaptureSessionPresetInputPriority
,而不再是之前的设置的 preset1
。
通过官方文档以及 Google
出的资料,AVCaptureSessionPresetInputPriority
代表 capture session
不去控制音频与视频输出设置。而是通过已连接的捕获设备的 activeFormat
来反过来控制 capture session
的输出质量等级。放到我们上面的场景,也就是最终回到直播拍摄页时,preset
变成了封面拍摄时的 preset
(即 4:3
的 preset2
),进而导致了输出画面变形。其实想想也对,设备全局是同一个摄像头,上一次的更改的参数值,应该是会被保留到下一次的,所以下一次在用之前最好做一次判断是否要重新设值。
解决方案就是每次相机页面 viewDidAppear
的时候判断一下 captureSession
的 preset
和预设的值是否一致,不一致,再设回来即可。
以上,如有错误,欢迎指出,一起交流探讨。
参考链接:http://t.cn/R8fAZ37
作者: 高老师很忙
当我们项目中有很多 Target
,并且不同 Configurations
下的配置也不同的时候,直接配置 BuildSettings
是一件很痛苦的事情,这个时候就可以用 xcconfig
来解耦了。xcconfig
是用来保存 BuildSettings
键值对的纯文本文件,并且还可以共享公用的配置,在中大型项目中很是实用。
我们来举个简单栗子🌰吧,创建2个xcconfig
文件,一个是Common.xcconfig
(公共设置),一个是Debug.xcconfig
(Debug的时候使用的),如图1;
如图2;
如图3;
这个时候我们去 Build Settings
里面去查看就可以看到我们写入的内容了,如图4。
作者: 南峰子_老驴
来复习一下编译 Objective-C
源文件的过程吧。用下面的命令输出编译源文件的不同阶段:
clang -ccc-print-phases main.m
输出结果如下:
0: input, "main.m", objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image
简单解释一下1-6的处理:
- 预处理:处理包括宏替换、头文件导入;
- 编译生成IR(中间代码):词法分析、生成AST、静态分析等,然后生成LLVM代码;
- 汇编器生成汇编代码;
- 汇编器将可读的汇编代码转换为机器代码;
- 将多个目标对象文件合并为一个可执行文件;
- 生成image文件,即最后的可执行文件;
参考