前言
年前时候接手了一个五六年前的老项目,有一些问题已经解决了,之前在老版本的Xcode上面运行也还能接手,一两分钟运行起来,现在切换到Xcode 15上面运行,调试,每一次真的是要命,运行5,6,7,8十来分钟,巨慢,警告六七万个,内存动辄十几二十几G,Mac内存都警告了,高峰时三十多G,实在是不能忍受,严重影响开发效率。
很多这个警告:
Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
因为这个项目里面引用的库,太多,还有第三方的项目,乱七八糟,啥都有,导致现在越来越慢,重复的东西太多,还不能乱改,牵一发而动全身。
解决历程
针对这个问题,网上一通找,其实已经多次试图解决这个问题,但始终没有找到切实可行的方法,
网上大概的解决方法:
- 打开File---workspace setting...---Build System:选择Legacy Build System。
老项目还是用老的编译系统吧。
但是很可惜,新版本的Xcode已经没有这个选项了
- 还有说是发现组件内的所有文件在编译的时分都会有几个相似的正告。
这些正告来自同一个文件,通过pch文件引证。
有正告的文件是是很早以前建立的,文件里边没有自动生成NS_ASSUME_NONNULL_BEGIN文件内大概有很多个正告。在编译文件的时分,这些警告都会去做缓存、分析。导致运行起来十分卡顿。
处理
消除正告,从头编译,发现项目跑起来十分的酣畅!
如果是有其他第三方库或许组件的警告,能够在Podfile中添加 :inhibit_warnings => true 来防止编译的时分查看警告。这种方式也会加速编译速度。
在Podfile文件里面都加了,重新pod install,然并卵。
- 针对这个问题:
Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
在项目中的类中基本上都加了:
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
也没有什么用,依旧还是很慢,
- 可能跟3这个有关系,最近太忙,没时间来搞这个,等等再说。
后话
目前还没有解决我的问题,发挥大家的力量,有类似解决的提供一下解决方法,不胜感激。
终极解决方案——Xcode 消除各种警告
简单粗暴,直接消除警告,项目里面的警告是在是太多,一个一个的改,要改到天荒地老,要吐血。
首先点击这个警告,右键->reveal in log就能看到警告的详细描述,就能看到[]里面的字符就是警告对应的标识符。
如果Reveal in Log不可点击或者点击无效,可以重新编译或者重启下Xcode
比如 Implicit conversion loses integer precision: ‘NSInteger’ (aka ‘long’) to ‘int32_t’ (aka ‘int’) 警告 显示的就是 -Wno-shorten-64-to-32。其中 -W是前缀,这个前缀表示的是 打开这种类型的警告 如果我们是要关闭某种类型的警告的话, 要将 -W换成 -Wno- ,也就是 -Wno-shorten-64-to-32。
如果整个项目都不想显示这个警告,就可以在Build Setting里加上这个标示符,Build Setting里搜索Other Warning Flags里添加关闭警告的命令。
如果只是针对某个文件不想显示这个警告,则可以Build Phases->Compile Sources下找到相应的文件在Compiler Flags下面加上命令即可。如果只是针对一段代码不显示某个警告,可以加上如下代码
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wunused-variable"
//这里是会报警告的代码
#pragma clang diagnostic pop
如果不想显示通过cocoapod导入的第三方库的警告,则可以直接在Podfile文件里加入inhibit_all_warnings!,加在platform下面就可以。
忽略警告类型
-Wno-nullability-completeness
-Wno-shorten-64-to-32
-Wno-arc-performSelector-leaks
-Wno-deprecated
-Wno-nonnull
-Wno-undeclared-selector
-Wno-objc-property-synthesis
-Wno-deprecated-declarations
-Wno-deprecated-implementations
常见的警告类型有:
1, 声明变量未使用 "-Wunused-variable"
2, 方法定义未实现 "-Wincomplete-implementation"
3, 未声明的选择器 "-Wundeclared-selector"
4, 参数格式不匹配 "-Wformat"
5, 废弃掉的方法 "-Wdeprecated-declarations"
6, 不会执行的代码 "-Wunreachable-code"
7, 指针类型不匹配 "-Wincompatible-pointer-types"
8, 没有实现已声明的方法 "-Wincomplete-implementation"
9, -没有实现协议的方法" "-Wprotocol"
10, 尚未声明的函数(通常指c函数) "-Wimplicit-function-declaration"
11, 使用performSelector可能会出现泄漏 "-Warc-performSelector-leaks"
12.[-Wimplicit-retain-self]
Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
13、[-Wstrict-prototypes]
block 中的void
14、-Warc-retain-cycles
capturing 'self' strongly in this block is likely to lead to a retain cycle
15、[-Wunreachable-code]
code will never be executed
添加完确实少了很多,很有效果。
还有一万多个:
添加完所有:
这个也是一把双刃剑,添加上就没有相关的警告了,自己要多注意代码规范了。
自己慢慢探索吧!
Xcode 的内存终于下来了,终于解决了我的问题,现在运行十几秒就运行起来了,不考虑其它的问题,还是挺流畅的。