Objective-C的警告

Apple LLVM 7.0 - Warning - objective C

  • Direct userage of ‘isa’ 直接使用 isa

  • Duplicate Method Definitions 重复的方法定义

  • Implict Atomic Objective - C Properties 隐式的原子属性

  • Implict Synthesized Properties 隐式的合成属性

  • Incomplete Objective - C Protocols 不完整的实现协议方法

  • Overridding Deprecated Objective - C Methods 压倒一切弃用的oc方法

  • Strict Selector Matching 严格的选择器匹配

  • Undeclared Selector 未申报的选择器

  • Unintentional Root Class 无意的根类

警告的种类

  1. -Wall 并不是所有警告。这一个警告组开启的是编译器开发者对于“你所写的代码中有问题”这一命题有着很高的自信的那些警告。要是在这一组设定下你的代码出现了警告,那基本上就是你的代码真的存在严重问题了。
  1. -Wextra 如其所名,-Wextra组提供“额外的”警告。这个组和-Wall组几乎一样有用,但是有些情况下对于代码相对过于严苛。一个很常见的例子是,-Wextra中包含了-Wsign-compare,这个警告标识会开启比较时候对signed和unsigned的类型检查,当比较符两边一边是signed一边是unsigned时,产生警告。

  2. -Weverything 这个是真正的所有警告。但是一般开发者不会选择使用这个标识,因为它包含了那些还正在开发中的可能尚存bug的警告提示。

控制警告,局部加入或关闭

Clang提供了我们自己加入警告或者暂时关闭警告的办法。

强制加入一个警告:

//Generate a warning
#pragma message "Warning 1"

//Another way to generate a warning
#warning "Warning 2"

//Generate an error to fail the build.
#error "Something wrong"

关闭某个警告:

  1. 如果需要全局关闭的话,直接在Other C Flags里写-Wno-…就行了,比如-Wextra -Wno-sign-compare就是一个常见的组合。

  2. 如果相对某几个文件开启或禁用警告,在Build Phases的Compile Source相应的文件中加入对应的编译标识即可。

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

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored “-Wunused-variable”
    int a;
    #pragma clang diagnostic pop

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