去掉Xcode工程相关警告

在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,又或者我们自己部分的代码出现了警告,那么我们能够有办法将这些警告清理掉么?以下讲的的一些方法可能比较有效的帮助你解决问题。

第三方代码

最直接,最一劳永逸,最安全的方式,直接找到警告的那段代码,改为不警告.这个方式,最安全.可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写的源码,使用这种方法侵入性太强,显然就不太可取了。

1.使用编译器提供的宏来操作,如下面我们经常看到的:

1
2
3
4
5
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdeprecated-declarations"
//写在这个中间的代码,都不会被编译器提示-Wdeprecated-declarations类型的警告
dispatch_queue_tcurrentQueue =dispatch_get_current_queue();
#pragma clang diagnostic pop

或者

1
2
3
#ifndef __clang_analyzer__
// Code not to be analyzed
#endif

具体的警告对应的类型我们可以查看Which Clang Warning Is Generating This Message,当然也可以通过查看具体的警告信息,选择Reveal in Log可以查看到是哪种“-Wno-shorten-64-to-32”的警告,但是这种改法需要更改大量的地方。

2.关闭某一个指定文件制定类型的警告,可以选择工程具体的target->Build Phases->Compile Sources找到具体的文件,双击后填写需要忽略的类型,类似忽略不使用arc-fno-objc-arc我们可以对这个特定的文件加入-Wno-shorten-64-to-32表示忽略该中类型的警告。这种工作量还是比较大。

3.关闭工程中指定类型的警告,target->Build Settings->Other Warning Flags 加入-Wno-shorten-64-to-32表示忽略工程中该类型的所有警告。这种类型会将当前工程自己部分代码也忽略掉。

4.在我们使用podfile管理第三方的文件cocoapods的时候,我们可以在引用库的的时候加入inhibit_warnings => true

1
pod 'XGPush',             '2.3',     :inhibit_warnings => true

当前工程代码

如果是我们工程中,那么建议最好全部按照最新的要求进行全部修改,为了避免出现警告,可以采取一些有效的措施。

1.我们可以将int的类型的都定义成NSInteger,float定义成CGFloat的类型,避免在不同的armv中出现警告的问题。

2.我们可以将target->Build Settings->Treat Warnings as Errors(将警告视错误)防止开发人员提交警告。

参考

1.is-it-possible-to-suppress-xcode-4-static-analyzer-warnings

2.performselector-may-cause-a-leak-because-its-selector-is-unknown/7073761#7073761

3.ignore-all-warnings-in-a-specific-file-using-llvm-clang