iOS开发中的警告(Objective-C和Swift)

在Xcode中,Build Settings选项里为我们提供了很多警告开关,对于每一个开关,在右侧的Quick Help面板里都有详细说明。如下图所示:


在编译选项中加入合适的flag能够打开或者关闭警告:在Build Setting中的Other C Flags里添加形似-W...的编译标识。你可以在其中填写任意多的-W...以开关某些警告,比如,填写为-Wall -Wno-unused-variable即可打开“全部”警告(其实并不是全部,只是一大部分严重警告而已),但是不启用“未使用变量”的警告。下面是对一些常用编译标识的一些解释:
 
-Wall 并不是所有警告。这一个警告组开启的是编译器开发者对于“你所写的代码中有问题”这一命题有着很高的自信的那些警告。要是在这一组设定下你的代码出现了警告,那基本上就是你的代码真的存在严重问题了。但是同时,并不是说打开Wall就万事大吉了,因为Wall所针对的仅仅只是经典代码库中的为数不多的问题,因此有一些致命的警告并不能被其捕捉到。但是不论如何,因为Wall的警告提供的都是可信度和优先级很高的警告,所以为所有项目(至少是所有新项目)打开这组警告,应该成为一种良好的习惯。
 
-Wextra 如其所名,-Wextra组提供“额外的”警告。这个组和-Wall组几乎一样有用,但是有些情况下对于代码相对过于严苛。一个很常见的例子是,-Wextra中包含了-Wsign-compare,这个警告标识会开启比较时候对signedunsigned的类型检查,当比较符两边一边是signed一边是unsigned时,产生警告。其实很多代码并没有特别在意这样的比较,而且绝大多数时候,比较signed和unsigned也是没有太大问题的(当然不排除会有致命错误出现的情况)。需要注意,-Wextra-Wall是相互独立的两个警告组,虽然里面打开的警告标识有个别是重复的,但是两组并没有包含的关系。想要同时使用的话必须在Other C Flags中都加上.
 
-Weverything 这个是真正的所有警告。但是一般开发者不会选择使用这个标识,因为它包含了那些还正在开发中的可能尚存bug的警告提示。这个标识一般是编译器开发者用来调试时使用的,如果你想在自己的项目里开启的话,警告一定会爆棚导致你想开始撞墙..

Objective-C中有两种方法强制加入一个警告:


对于第二种写法,把warning换成error,可以强制使编译失败。

Swift中强制加入一个警告:

首先添加一个运行脚本:


输入以下内容:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"


然后可以添加警告了:


对于关闭某个警告,如果需要全局关闭的话,直接在Other C Flags里写-Wno-...就行了。如果相对某几个文件开启或禁用警告,在Build Phases的Compile Source相应的文件中加入对应的编译标识即可。例如对某个文件添加-Wno-unused-variable编译标识就可以忽略未使用变量的警告信息:


如果只是想在某几行关闭某个警告的话,可以通过临时改变诊断编译标记来抑制指定类型的警告,具体如下,count是一个未使用的变量:

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-variable"
    
    int count ;

    #pragma clang diagnostic pop
或者

    int count ;
    #pragma unused(count)

对于这些警告的标识名,我们可以通过以下两种方式获取:

1.有人整理了一个网站来,里面包含了很多警告抑制的字符串 http://fuckingclangwarnings.com

2.通过快捷键cmd+8,查看警告详情来找到标识符:


另外也可以只把某些警告当作错误,-Werror=...即可,同样地,也可以在-Werror被激活时使用-Wno-error=...来使某些警告不成为错误。结合使用这些编译标识可以达到很好的控制。

猜你喜欢

转载自blog.csdn.net/junjun150013652/article/details/52635220