龙熠的技术小站

Fauxpas命令行使用介绍与规则全解析

Faux Pas是一个Xcode辅助工具,用以检查Xcode项目,找出常见的错误、隐藏的bug、不良实践以及可维护性问题和风格问题。 拥有可视化界面和命令行两种操作方式。

命令行的使用

基本格式

1
Fauxpas [选项] <命令>

命令列表

check <.xcodeproj文件的路径> : 检查指定的Xcode项目

check-xcode : 检查当前的xcode项目,这个命令必须运行在Xcode项目的run script里,run script中写法示例:

1
2
3
4
5
6
7
8
[[ ${FAUXPAS_SKIP} == 1 ]] && exit 0
FAUXPAS_PATH="/usr/local/bin/fauxpas"
if [[ -f "${FAUXPAS_PATH}" ]]; then
"${FAUXPAS_PATH}" check-xcode
else
echo "warning: Faux Pas was not found at '${FAUXPAS_PATH}'"
fi

rules <可选规则的名称> : 显示规则的详情

tags <可选标签的名称> : 显示标签的详情

exampleconfig : 输出一个配置文件的例子

validateconfig <配置文件的路径> : 验证该配置文件是否有效

clearcaches <.xcodeproj文件的路径> : 清理该项目中所有Faxu Pas的缓存

updatelicense <证书类型> <证书名称> <证书key> : 更新授权

1
2
证书类型(四种):
personal, organization-seat, site, enterprise

help : 显示完成使用信息

docs : 显示文档

version : 显示app版本号

选项列表(options)

-t, –target : 要检查的Xcode target

-b, –buildConfig : 要检查的Xcode编译配置

-r, –rules : 要使用的规则(默认是空,[]),这value必须是规则的短名称

–onlyRules : 只用这一条规则,value必须是规则的短名称,使用这个选项会覆盖所有其他规则选定的选项

-g, –ruleTags : 要应用的规则tag,默认是[“Recommended”],选择拥有指定tag的规则

–excludedRules : 排除规则,默认是空[], 排除指定规则,哪怕这些规则已经被选中

-c, –configFile : 指定一个配置文件,如果项目已经有一个配置文件了,这个将覆盖它

-x, –fileExclusionPrefixes 排除带有特定前缀的文件,例如”HG”,将排除”HGObject.m”和”NSString+HGExtensions.m”

–fileExclusionXcodeGroups : 排除Xcode项目中group,默认是[“Vendor”],

–fileExclusionRegexes : 按照正则表达式排除文件,默认是空[],按照给定的ICU正则表达式匹配的绝对路径排除文件

–minErrorStatusSeverity <”Concern”/“Warning”/“Error”/“Fatal”/“None”> : 最小的诊断严重性来返回非零的退出状态,默认是Error,如果一个诊断在给定的严重性级别或者更高,则返回一个非0的值,如果设置为None,则永远返回0(0即成功)

–workspace : 指定构建项目的Xcode工作空间。指定一个工作空间(伴随着scheme 选项)如果这个项目无法单独编译起来(例如cocoapod集成的情况)

–scheme : 指定编译项目的scheme,(一般伴随着workspace选项一起),如果这个项目无法单独编译起来(例如cocoapod集成的情况)

–numConcurrentJobs : 多线程检查的数量,如果这个值是忽略或0,Faxu Pas会自己定一个合适的值

–extraCompilerArgs : 额外的编译参数,默认是空[],用于分析源代码文件

–extraXcodebuildArgs : 额外的xcodebuild参数,默认是[],用于xcodebuild运行时

-f, –fullBuild : 在检查前先运行项目,默认是no,如果在构建过程中项目生成源文件
或者在项目源代码的成功解释,则为yes,否则就会用完成的构建来替代。这样会花费更多时间,但是会有效减少一些cased有关false的数量

–cacheBuildLog : 缓存项目构建日志,默认是yes,这会加大检查过程中的运行时间

–useOwnModulesCache : 使用自己的模块来缓存,默认是yes,这是为了避免和系统缓存冲突

–processOnlyTargetPCHs : 处理单一target预编译头文件,默认是yes,关闭这个设置将使得检查变得很慢,在某些共享的预编译头文件中可能是必须的

-v, –verbose : 可以打印出更多的日志细节,默认是no

-o, –outputFormat <”human” / “json” / “plist” / “xcode”> : 输出格式,默认”human”

使用文档

检查一个Xcode项目

Fauxpas针对项目target使用单独的Build Configuration执行检查, 最起码必须指定一个项(如果不指定的话,FauxPas能够选择一个默认target和build Configuration)

选择应用什么规则

规则可以通过tag选择或者单独选择,也可以把某些规则单独排除,排除逻辑最后执行,因此如果你选中了一个tag,但是要排除其中一条规则,这个规则将不会执行

  • GUI:

    • 在规则选择视图里点击选择规则的tag,tag里的规则将显示在分栏的左侧
    • 选择独立的规则
    • 右键规则选择排除规则
  • 命令行:

    • 使用 -g / –ruleTags 来选择要应用的tag
    • 使用 -r / –rules 来选择独立的规则
    • 使用 –excludedRules 来排除独立的规则

      1
      例如,Fauxpas -g [tag名称A1] -r [选择规则B1] --excludedRules [要排除的规则C1] check [项目地址],意味着检查的规则即[A1的规则合集+B1-C1 = 最终的规则]

推荐: 选择规则尽可能通过tag选规则,避免选择单独规则,也不希望你排除某些规则,已经选择的规则在规则版本更新后也依然会选中

在命令行中,尽可能使用–onlyRules来运行单独的规则,当项目有一个配置文件选择好规则和标签也会很方便

使用命令行

要使用命令行,首先要安装fauxpas命令:

  • GUI: 菜单里选择 Faux Pas > Install CLI Tools…

  • 命令行: 运行命令/Applications/FauxPas.app/Contents/Resources/install-cli-tools

fauxpas命令安装在/usr/local/bin中,可以用fauxpas help查看更多文档

配置

FauxPas可以通过如下进行配置:

  • 命令行参数 (如果使用命令行接口)
  • 可视化工具
  • 配置文件

配置文件(Configuration files)用JSON写的,要看完整例子,请运行fauxpas exampleConfig

命令行可以用-c / –configFile选择一个配置文件

指定项目的配置文件

添加一个指定项目的配置文件需要把配置命名为FauxPasConfig.fauxpas.json,添加在项目的根目录里(和要检测的.xcodeproj文件同级)

如果有多个配置文件,新建一个FauxPasConfig文件夹,把默认执行的那个命名为main.fauxpas.json.

项目配置文件可以被自动加载

配置建议

许多FauxPas配置选项检查时需要很长时间,默认的配置最好是在速度和项目通用性上取得一定平衡, 为了特定项目加速,可以稍微调整一下选项

以下是让检查提速的一些小建议:

  • 如果你想检查的这个项目能够独立编译的话,就最好避免选择一个workspace(–workspace)和scheme(–scheme)。
  • 避免执行完整编译(-f, –fullBuild ),如果该项是关闭的,开始检查时会更快。有时必须打开该选项(如果项目在构建期间生成头文件),但是大部分项目不开也没有问题
  • Process only target PCHs.(–processOnlyTargetPCHs )如果这个选项是打开的,会比不开更快,有时候必须要关闭,但是大部分项目都是打开的
  • 只选择一个指令集,如果你项目编译时是多指令集,可以通过限制构建单指令集来提速。在build setting里的ARCHS上增加一个值(–extraXcodebuildArgs )例如 ARCHS=armv7.

诊断结果过滤

“Diagnostics”视图有一个输入框允许输入要过滤的关键字,用来过滤诊断结果

可以添加多个过滤,依序执行

支持下列过滤方式:

  • 文件过滤: 例如: file=foo.mfile=*ViewController.m
  • 规则过滤: 例如: rule=Dot syntax usage
  • 影响面过滤: Show only diagnostics with the specified impact (Functionality, Maintainability, Style). For example: impact=Functionality
  • 可信任等级: 例如: confidence=High
  • 严重性: 例如: severity=Error

阻止诊断

如果你发现通过特定规则抛出的诊断是无用的(或不同意规则的基本前提) 请参看 exclude that rule from being applied.

代码中阻止诊断

如果希望规则保持可用状态,但是在代码的特定部分不可用,则可以在FauxPasAnnotations.h使用宏定义, 如下:

要添加这个头文件:

  • 运行FauxPas可视化工具
  • 打开项目
  • 选择 [Project > Add Annotations Header]菜单项

关于如何使用宏的详细说明,参见头文件内说明

阻止诊断特定文件和文件夹

每个规则都有一个添加忽略文件路径的选项,只要匹配需要忽略文件的正则表达式,该文件诊断时会忽略这个规则

排除特定文件、文件夹、Xcode组

如果希望排除一些文件,可以依照如下操作:

  • 按照正则表达式来排除 [–fileExclusionRegexes]
  • 按照文件前缀来排除 [–fileExclusionPrefixes]
  • 按照Xcode组来排除 [–fileExclusionXcodeGroups]

小提示:这些选项不能阻止诊断匹配的文件,因为已经被排除出去了.

快捷运行Faux Pas

快速打开FauxPas可视化中的Xcode项目

可以用命令行打开指定Xcode,也可以用AppleScript来获得当前Xcode项目的路径:

1
open -a FauxPas "`osascript -e 'tell application \"Xcode\" to return path of active project document'`"

可以用帮助程序(例如Keyboard Maestro, FastScripts, 或 Spark)来指定快捷键

在Xcode构建期执行检查

Faux Pas能够在构建期执行。允许在Xcode中查看诊断,并跳转到相关文件位置.这个方法也允许Faux Pas打断构建并返回一个非零值 (–minErrorStatusSeverity 选项可以控制FauxPas返回错误退出码的条件).

  • 确保你安装了FauxPas CLI工具
  • 项目里创建“Run Script”
  • 添加下列代码:
1
2
3
4
5
6
7
8
[[ ${FAUXPAS_SKIP} == 1 ]] && exit 0
FAUXPAS_PATH="/usr/local/bin/fauxpas"
if [[ -f "${FAUXPAS_PATH}" ]]; then
"${FAUXPAS_PATH}" check-xcode
else
echo "warning: Faux Pas was not found at '${FAUXPAS_PATH}'"
fi

构建时就会运行这段代码,如果要关闭,则可以添加编译参数FAUXPAS_SKIP值为1时关闭.

在Xcode中手动调用Faux Pas

要在Xcode中运行FauxPas:

  • 确保安装了FauxPas命令行工具
  • 创建一个target名字为Faxu Pas
  • 在这个target里创建一个Run Script,命名为Run Faux Pas
  • 在脚本里添加如下内容,取代项目PROJECT_NAME的实际名称:
1
/usr/local/bin/fauxpas -o xcode check "PROJECT_NAME.xcodeproj"

现在可以通过运行Faux Pas的scheme来调用Faux Pas了

自定义脚本来配置诊断

如果你想写自己的脚本来配置FauxPas执行的诊断,第一件事是产生机器可读的输出

产生机器可读的输出

命令行中–outputFormat (或 -o) 参数允许你指定输出格式,可能的值如下:

  • human — 人类可读的格式 (默认)
  • json — 输出JSON格式
  • plist — plist格式(XML)
  • xcode — 可以被Xcode的基于行数的输出。当时用check-xcode命令行时,默认是本项,在Xcode里显示诊断的错误和警告

在可视化工具中,能够在diagnostics视图中点击Export Diagnostics… 按钮来保存诊断信息到文件中

机器可读的输出结构

所有的机器可读的格式,诊断实际上的结构是一样的 - 只有序列化的变化(唯一的异常是plist没有null值)

plist根对象有下列区域(field):

  • fauxPasVersion — Faux Pas版本
  • timeStamp — 输出时的时间戳
  • projectPath — .xcodeproj文件夹的路径
  • projectName — 检查的xcode项目的名称
  • targetName — 检查的target的名称
  • targetBundleVersion — 被检查的target的Info.plist的CFBundleVersion值
  • buildConfigurationName — xcode使用的构建配置的名称
  • projectIconBase64PNG — 项目图标是base64的PNG(120 * 120)(在Faux Pas可视化工具中显示)
  • versionControlSystemName — 项目使用的版本管理工具的名称
  • versionControlRevision — 当前的版本管理工具修订标志位(目前只支持git)
  • diagnostics — 诊断对象的数组

    诊断对象有下列的区域(field):

    • ruleShortName — 产生该诊断的规则的名称简写
    • ruleName — 产生该诊断的规则的名称全称
    • ruleDescription — 产生该诊断的规则的完成描述
    • ruleWarning - 相关产品诊断的易读的警告
    • info — 诊断的易读信息
    • html — 一个包含以上所有的key,值是HTML格式的的字典
    • identifier — 通过每个规则选择的任意值,通常用于指定一些诊断提及的数据(例如规则[Missing Translation]将指出缺少的字符串资源的key)
    • file — 诊断提及的文件的完整路径
    • context — 诊断提及到的代码片段的父代码符号的名称/签名(例如,一个函数或方法,或类)
    • extent — 诊断提及到的文件部分的位置标识
    • 开始和结束都是如下的结构:
      • line — 行号
      • byteColumn — 字节表示的行的列
      • byteOffset — 字节表示的从文件起点开始计算的偏移值
      • utf16Column — UTF-16表示的行的列
      • utf16Offset — UTF-16表示的从文件起点开始计算的偏移值
    • fileSnippet — 诊断提及到的文件片段的内容
    • impact — 诊断描述的问题的影响 (功能性,可维护性或风格)
    • severity — 诊断的严重性(从[0-10]划分, 更高的值代表更严重,3表示关心级,5表示警告级,9表示错误级)
    • severityDescription — 严重性的正式描述
    • confidence — 诊断的可信度 (从[0-10]划分,更高的值代表更可信)
    • confidenceDescription — 可信性的正式描述

处理机器可读的输出

可以在你认为合适的方式来处理诊断数据, 但是只有一个建议,使用带有JSON输出格式的jq

下列是一个例子输出项目中未使用的资源文件:

1
2
3
4
$ fauxpas --onlyRules UnusedResource -o json check MyProject.xcodeproj \
| jq --raw-output '.diagnostics[] | .file'
/Users/username/myproject/unused1.jpg
/Users/username/myproject/unused2.xml

发现并修理

Faux Pas会在编译项目的时候抛出编译错误

Faux Pas 使用Clang的轻量版本编译(虽然LLVM/Clang是开源的,但是苹果依照其做了闭源版本).

比较Clang版本

运行下列的代码可以来查看你的Xcode安装的Clang的版本:

1
xcrun clang -dM -E -x c /dev/null | grep __VERSION__

以及下列的代码可以来查看你使用的Faux Pas安装的版本:

1
fauxpas -v version | grep Clang

提示, 苹果使用自己定的的Clang分支版本,所以会有不同. 下列资源也许能够帮你: https://gist.github.com/yamaya/2924292.

减少编译警告

如果在项目里使用警告标记-Weverything, 尝试移除它(这个标记能够打开Clang里所有的警告, 甚至新的,有bug的或者试验性的警告). 如果你不想在项目配置里关闭这个flag, 但是希望在FauxPas里关闭它,可以使用添加(–extraCompilerArgs)添加-Wno-everything

如果希望关闭Fauxpas所有的编译警告(但是项目里不关闭)(–extraCompilerArgs)添加-w即可

Faux Pas检查项目时失败

请确认FauxPas使用正确的xcodebuild参数. 如果你打开了–verbose选项,FauxPas将打印xcodebuil参数

为了确定需要什么xcodebuild参数来正确构建项目,可以用终端进入包含.xcodeproj的文件夹,尝试运行一下xcodebuild(和FauxPas使用一样的参数)

生成项目源代码

如果你的项目在构建时期产生或修改源文件(例如头文件),你必须打开“Build project before checking” (–fullBuild) 选项. 这同样适用于依赖构建时期产生的东西来正确理解你的项目的源码的情况 (例如一个独立的项目).

使用workspace构建项目

如果你的项目使用Xcode的workspace来正常构建,你必须设置 –workspace 和 –scheme 选项.

当你打开一个项目文件但是没有指定的配置文件, 一份配置帮助表将会帮你更方便的选择workspace和scheme

我安装了多个版本的Xcode,如果确保FauxPas用的是我希望的那个版本呢?

Faux Pas使用xcrun来找到所有的Xcode开发工具(例如.xcodebuild)如果你打开–verbose选项, 当检查一个项目时,Faux Pas将打印这些的路径到日志里

可以用xcode-select来改变系统使用的Xcode

1
xcode-select -switch /Applications/Xcode.app

如果你不想全部修改Xcode版本,可以在执行FauxPas之前设置DEVELOPER_DIR环境变量

1
DEVELOPER_DIR="/Applications/Xcode.app" fauxpas <arguments...>

规则列表

UndetachedDelegate

未解绑的delegate或data source

Tags(点击tag可跳转): BestPractice, Recommended

当一个对象将自己设置成delegate或者其成员的数据源,必须在[NSObject dealloc]里解除引用.

Options:
UndetachedDelegate.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


InvalidStringsFile

应用于本地化项目的无效字符串资源文件(字符串资源文件应该是有效的plist)

Tags(点击tag可跳转): Recommended, Localization

Options:
InvalidStringsFile.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


StringsFileEncoding

字符串资源文件不是UTF-8编码

应用于.git管理的项目

Tags(点击tag可跳转): Recommended, Localization, VCS, BestPractice

git选择使用UTF-8编码,并不能很好的支持其他编码(例如UTF-16)。会把UTF-16文件当做二进制文件,不能逐行显示差别

Options:
StringsFileEncoding.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UIKitKVO

使用KVO观察UIKit对象

Tags(点击tag可跳转): Recommended, APIUsage

UIKit框架的类通常不支持KVO,如果KVO在这类property上工作,会发生不可知的行为,且未来也不能保证能运行良好

扩展阅读:
Cocoa Core Competencies: Key-value observing

Stack Overflow: “How do I know if a property is KVO-compliant?” — Answer
by Dave DeLong, App Frameworks Evangelist at Apple

Options:
UIKitKVO.allowSubclasses
(Boolean. Default: yes)
允许观察自定义的实现了KVO的UIKit子类(这种情况不抛出警告)

UIKitKVO.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnnecessaryNullCheck

在free()调用前检查多余的NULL

Tags(点击tag可跳转): Recommended, Pedantic

free(NULL)是空指令,什么也不做

扩展阅读:
free() man page

Options:
UnnecessaryNullCheck.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


RetinaImagesResolution

非预期的高清图片分辨率

Tags(点击tag可跳转): Recommended, Resources

@2x或@3x的图片资源必须和低倍的图片尺寸相匹配(即刚好是其2倍或3倍尺寸,因为无论屏幕尺寸多大,其展示的上下文是完全一样的),否则图片的有效分辨率会不匹配其上下文的分辨率,将导致出现一个模糊的图片,边框空白或者溢出

扩展阅读:
Apple Developer: Optimizing for High Resolution

Options:
RetinaImagesResolution.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


AssertionSideEffects

断言的副作用

Tags(点击tag可跳转): Recommended, BestPractice

如果断言宏正文包含了无getter函数或方法的调用,则该规则会抛出警告

断言不应该有副作用,因为正常情况下release打包后是失效的 - 程序的行为不应该依赖断言生效与否

本条规则涉及范围是Foundation的断言宏

Options:
AssertionSideEffects.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


SuspiciousResources

可疑的bundle资源

Tags(点击tag可跳转): Recommended, Resources

许多文件是项目的一部分,只能在build或者development的时候生效(例如Xcode配置文件),如果添加到bundle资源中就会导致错误

Options:
SuspiciousResources.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


NullCoalescingOp

和空对象合并操作

Tags(点击tag可跳转): Recommended, Style

(obj ? obj : other)的表达式可以写成obj ?: other

Options:
NullCoalescingOp.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


LoadMethodWithoutAutoreleasePool

[NSObject load]方法中没有@autoreleasepool

该规则适用于iOS 5或Mac OS 10.7 及之前的项目target中

Tags(点击tag可跳转): Recommended, BestPractice

要执行+[NSObject load],需要手动建立一个自动释放池

补充阅读:
Mike Ash: Friday Q&A 2009-05-22: Objective-C Class Loading and
Initialization

Options:
LoadMethodWithoutAutoreleasePool.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnknownResourceCodeReference

代码引用未知资源

应用于target上

Tags(点击tag可跳转): Recommended, Resources

从硬盘上实时加载的资源,本应该提前放在正确路径的bundle中。注意iOS模拟器运行在Mac上,和其不同,iOS设备有一个区分大小写的系统

Options:
UnknownResourceCodeReference.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


StringsdictWithoutStrings

.stringdict文件没有匹配.string文件

应用于本地化项目

Tags(点击tag可跳转): Recommended, Localization

如果一个.stringsdict文件作为资源包含进项目,一个同名的.string文件也需要包含进项目,即使是空的,否则将不能从.stringsdict文件中读取翻译

扩展阅读:
Foundation Release Notes for OS X v10.9

Options:
StringsdictWithoutStrings.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


InitializeSuperInvocation

+[NSObject initialize]调用了super方法

Tags(点击tag可跳转): Recommended, BestPractice

+[NSObject initialize]的实现中不应该调用了super方法,initialize这个方法比较特殊,它每一个子类是独立的。

Options:
InitializeSuperInvocation.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


CompilerWarnings

推荐的编译警告选项

Tags(点击tag可跳转): Recommended, BestPractice, Config

Some compiler warnings and warning groups are so useful that they should be
enabled at all times.

补充阅读:
Clang Compiler User’s Manual: Controlling Diagnostics via Command Line Flags

Xcode Build Setting Reference

GCC Warning Options (many are the same in Clang)

Options:
CompilerWarnings.flags
字符串数组,默认是[“-Werror”, “-Wall”, “-Wextra”, “-Wshadow”, “-Wfloat-equal”, “-Wundef”, “-Wnewline-eof”, “-Wempty-body”, “-Wconversion”, “-Wsign-compare”, “-Wreturn-type”, “-Wdeprecated-implementations”, “-Wimplicit-retain-self”]

CompilerWarnings.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnsupportedWeakReference

将一个不能weak的对象指定为weak属性

用于OS X target

Tags(点击tag可跳转): Recommended

在OS X中,许多类是不能创建weak实例(参见苹果文档中详细列表)

The Clang编译器会为上述不能weak的变量抛出警告

推荐阅读:
Transitioning to ARC Release Notes: Frequently Asked Questions: Which classes don’t support weak references?

Options:
UnsupportedWeakReference.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


HardcodedUIString

UI 字符串没有本地化

应用于本地化项目

Tags(点击tag可跳转): Recommended , Localization

所有的字符串倾向于使用NSLocalizedString()来本地化

Options:
HardcodedUIString.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


HardcodedSelfClass

硬编码自身类引用

Tags(点击tag可跳转): Recommended , BestPractice

如果一个Objective-C类(或者一个类实例)向自身发一个消息,例如[FOOThing alloc],推荐使用self来代替(例如[self alloc] or [[self class] alloc])这样实际的类将受到消息,子类化行为将不会被阻止

补充阅读:

Quality Coding with Jon Reid: How to Botch Your Objective-C Factory Method

Adopting Modern Objective-C: instancetype

Options:

HardcodedSelfClass.warnOnlyAboutAlloc
(Boolean. Default: no)
只限制alloc操作

HardcodedSelfClass.checkOnlyFactoryMethods
(Boolean. Default: no)
只检查工厂方法

HardcodedSelfClass.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MacroBasedIncludeGuard

用宏保障#include引用一次

Tags(点击tag可跳转): Recommended , BestPractice

通过#pragma once宏定义来检查是否引用了一次,能够简化头文件

补充阅读:
Wikipedia: Pragma once

Options:
MacroBasedIncludeGuard.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

注一:#pragma once与 #ifndef的区别


RestrictedDirectMethodCall

限制直接方法调用

Tags(点击tag可跳转): Recommended , APIUsage

许多系统类不能直接调用

本规则将不会对覆盖方法调用父类实现的情况抛出警告

Options:
RestrictedDirectMethodCall.allowInSubclass
(Boolean. Default: yes)
允许从子类直接调用,如果调用定义在父类的限制方法则不会抛出警告

RestrictedDirectMethodCall.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


RecommendedVCSIgnores

推荐的版本控制系统忽略项

应用于git管理的项目

Tags(点击tag可跳转): Recommended , VCS

当许多文件被建议在版本控制系统中忽略却实际上没有忽略则会抛出警告,反之亦然

推荐阅读:

Stack Overflow: Git ignore file for Xcode projects

CocoaPods Guides: Using CocoaPods

Carthage Documentation: Artifacts

Options:
RecommendedVCSIgnores.workspaceIgnored
(Boolean. Default: no)
Xcode工作空间数据应该被忽略

RecommendedVCSIgnores.cocoaPodsIgnored
(Boolean. Default: no)
CocoaPods数据应该被忽略(例如Pods文件夹,只有当CocoaPods在使用时才会警告)

RecommendedVCSIgnores.carthageBuildIgnored
(Boolean. Default: yes)
Carthage/Build数据应该被忽略(例如Pods文件夹,只有当Carthage在使用时才会警告)

RecommendedVCSIgnores.carthageCheckoutsIgnored
(Boolean. Default: no)
Carthage/Checkouts数据应该被忽略(例如Pods文件夹,只有当Carthage在使用时才会警告)

RecommendedVCSIgnores.appCodeUserDataIgnored
(Boolean. Default: yes)
用户指定的AppCode数据应该被忽略(例如.idea文件夹下的特定文件,只有当该文件夹存在时才会警告)

RecommendedVCSIgnores.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


RetainingImmutableProperty

没复制不可变property

Tags(点击tag可跳转): Recommended , BestPractice

如果用retain语义指定了一个@property(该属性是NSCopying类型的不可变属性),该规则会生成一个警告,因为这样也依然会产生一个可变子类变量(例如NSString)

这个规则帮助避免一个property的值发生改变却没有setter能调用的情况(例如:可变对象的setter是可以调用的)

Options:
RetainingImmutableProperty.ignorePrivateProperties
(Boolean. Default: yes)
不警告公共头文件以外的私有property

RetainingImmutableProperty.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


CompleteNotificationCenterDetachment

解除NSNotificationCenter绑定

Tags(点击tag可跳转): Recommended , BestPractice

当一个对象移除了自身作为所有通知的响应者(-[NSNotificationCenter removeObserver:] self)时抛出警告

如果一个父类或者一个子类希望保持观察通知,就会产生问题了。推荐在离开时解绑之前绑定在自身上指定的通知,而不是全部通知。

在-dealloc中移除所有通知并不会触发本规则

推荐阅读:
Big Nerd Ranch: Notifications part 3 - Gotchas: Over-aggressive
Unregistration

Options:
CompleteNotificationCenterDetachment.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MissingAPIUsageDescription

缺少API使用描述

应用于应用target

Tags(点击tag可跳转): Recommended , Config

一些API(例如访问联系人或者日历)需要在app的metadata(info.plist)里添加使用描述。当系统询问用户是否允许app访问时会将描述呈现给用户,本规则在使用类似功能然而没有添加相关描述时抛出警告

补充阅读:
Information Property List Key Reference: Cocoa Keys

Options:
MissingAPIUsageDescription.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


XIBRuntimeAttributeMismatch

XIB实时属性不匹配

Tags(点击tag可跳转): Recommended , Resources

当一个自定义XIB实时属性不能匹配对应类的源代码时抛出警告

A key path that doesn’t match any of the class properties or setter methods
yields a diagnostic, as does a mismatch in the type of the assigned value and
the value type declared for the property or setter.

Options:
XIBRuntimeAttributeMismatch.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ThreadUnsafeInstanceCaching

全局持有一个线程不安全的类实例

Tags(点击tag可跳转): Recommended

当全局存储一个对象指针指向线程不安全的类的实例时抛出警告

-[NSThread threadDictionary]能够用于缓存线程不安全的类的实例 - 每个线程都有一个这样的实例

这个规则会忽略代码复写了UIKit或者AppKit的子类(或者category)的情况,因为会假设主线程访问永远是安全的

补充阅读:
Threading Programming Guide: Thread Safety Summary

Options:ThreadUnsafeInstanceCaching.classNames
(字符串数组列表,默认是[“NSDateFormatter”, “NSNumberFormatter”, “NSMutableArray”, “NSMutableAttributedString”, “NSMutableCharacterSet”, “NSMutableData”, “NSMutableDictionary”, “NSMutableSet”, “NSMutableString”],这些线程不安全的类在本规则响应的范围内)

ThreadUnsafeInstanceCaching.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MissingTranslation

翻译缺失

应用于本地化项目

Tags(点击tag可跳转): Recommended , Localization

如果翻译缺少用于NSLocalizedString参数或者其变量的key,本规则会抛出警告

Options:

MissingTranslation.checkDevRegion
(Boolean. Default: no)
当缺少development region翻译时产生警告
(如果你不使用key作为隐式默认值时,就把这个设置为yes)

MissingTranslation.ignoredKeyPrefixes
(字符串数组,默认是[],忽略key的前缀,当缺少该前缀开头的key时不产生警告)

MissingTranslation.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

_LocalizationRules.localizedStringRoutines
(字符串数组,默认是[],用于替代NSLocalizedString的函数字符串,第一个参数假定是string key)


RestrictedMethodOverride

覆盖受限方法

Tags(点击tag可跳转): Recommended , APIUsage

系统类的一些方法不能被覆写

Options:
RestrictedMethodOverride.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MissingDeviceTypeResource

缺少对应设备类型的资源

应用于iOS target

Tags(点击tag可跳转): Recommended , Resources

当设备类型没有对应的资源文件时产生警告,例如image~iphone.png存在但是image~ipad.png不存在

补充阅读:

Resource Programming Guide: iOS Supports Device-Specific Resources

Options:

MissingDeviceTypeResource.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


OldVerboseObjCSyntax

废旧OC语句

Tags(点击tag可跳转): Recommended , BestPractice, Style

如果Objective-C字面量/boxed expression和下标符号没有被尽可能的使用,则报出警告

提示:现在Xcode可以自动修复这些代码了(Edit -> Refactor -> Convert To Modern Objective-C Syntax)

补充阅读:
Clang documentation: Objective-C Literals

WWDC 2012 Session videos (“Modern Objective-C” and “Migrating to Modern
Objective-C”)

Options:

OldVerboseObjCSyntax.expectLiteralSyntaxForMutableCollections
(Boolean. Default: no)
期望可变集合使用字面量语句,如果字面量语句没有用于初始化NSMutableArray和NSMutableDictionary

OldVerboseObjCSyntax.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ViewLayoutInXIB

XIB中错误的view layout

Tags(点击tag可跳转): Recommended , Config

当用了autolayout的view在XIB或storyboards中被标记为misplaced(错位)或ambiguous(含糊)时抛出警告

这个规则依赖Xcode中XIB的提示,这意味着如果Xcode没有提示,就没有诊断发出

Options:
ViewLayoutInXIB.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


IsEqualAndHash

实现了-isEqual但是没有实现-hash

Tags(点击tag可跳转): Recommended , APIUsage

如果-isEqual:来确定两个对象是否相等,就必须实现hash

补充阅读:
Cocoa Core Competencies: Object comparison

Options:
IsEqualAndHash.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


FileRefOutsideVCS

项目引用文件没有进入版本控制系统

适用于下列版本控制系统:Git,Mercurial, Bazaar, Subversion, Fossil

Tags(点击tag可跳转): Recommended , VCS

项目不应该含有任何不在版本控制系统工作主分支中的文件

Options:
FileRefOutsideVCS.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


LiteralStringKeyPath

传字符串作为keypath

Tags(点击tag可跳转): Recommended , APIUsage

当字符串作为keypath时抛出警告,因为任何错字或者拼写错误都不会被编译器察觉,最终导致不能正常工作。

比较好的方式是,例如NSStringFromSelector(@selector(foo))是安全的,因为编译器会去识别这个字符串,这可以帮助发现错别字并且允许自动重构工具带来一些合适的修正

补充阅读:
NSHipster: Key-Value Observing

Options:
LiteralStringKeyPath.ignoreCollectionsValueForKey
(Boolean. Default: yes)
集合中忽略 -valueForKey:,许多集合实现了valueForKey,可以在每一项上调用这个方法,每一项可能是NSDictionary

LiteralStringKeyPath.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


BasicProjectSettings

推荐的项目设置

Tags(点击tag可跳转): Recommended , Config, BestPractice

设置项 ‘Organization’ 和 ‘Class Prefix’ 应该总是打开,其他设置的值可以配置

Options:

BasicProjectSettings.indentType
(空格类型,值有”tabs”或”spaces”,默认是空,空表示这一项不检查)

BasicProjectSettings.tabWidth
(tab宽度,必须是正数,默认是空,空表示这一项不检查)

BasicProjectSettings.indentWidth
(缩进宽度,必须是正数,默认是空,空表示这一项不检查)

BasicProjectSettings.wrapLines
(换行,”wrap” / “nowrap”. 默认是空,空表示这一项不检查)

BasicProjectSettings.expectClassPrefix
(是否需要类前缀,布尔值,默认是yes)

BasicProjectSettings.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DuplicateTranslation

重复的翻译

适用于本地化项目

Tags(点击tag可跳转): Recommended , Localization

如果一个字符串资源文件包含重复的key,则抛出警告

Options:
DuplicateTranslation.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


StrongDelegate

retain或copy delegate

Tags(点击tag可跳转): Recommended , BestPractice

要避免引用循环,delegate的setter方法属性不能retain或copy

补充阅读:
Concepts in Objective-C Programming: Delegates and Data Sources:
Implementing a Delegate for a Custom Class

Options:
StrongDelegate.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ConstructorReturnType

构造器返回类型

Tags(点击tag可跳转): Recommended , BestPractice

如果一个初始化或者工厂方法返回类型其他类型而不是instancetype,则抛出警告

适当的指出工厂方法的返回值(例如 +[NSArray arrayWithObject:])允许编译器实现更多类型检查,这能帮助找到bug。虽然编译器自动决定了初始化方法的返回值(即使声明成id类型),但是用instancetype会更好

补充阅读:
Stack Overflow: Would it be beneficial to begin using instancetype instead of id?

Options:
ConstructorReturnType.checkInitMethods
检查初始化方法,布尔值,默认是no,如果发现不是instancetype就抛出警告

ConstructorReturnType.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


SetterInvocationInInitOrDealloc

在init或者dealloc里调用setter方法

Tags(点击tag可跳转): Recommended , BestPractice

推荐不要在init里或者dealloc里调用setter方法, 这可能触发KVC通知,本身触发的时候是期望被观察对象是有效的(init or dealloc里可能会导致创建和释放)

补充阅读:
Programming with Objective-C: Encapsulating Data: Properties Encapsulate an Object’s Values: Access Instance Variables Directly from Initializer Methods

Stack Overflow: Calling a method on self while in dealloc

WWDC 2012 Session video “Migrating to Modern Objective-C” (around 23min)

Google Objective-C Style Guide: Avoid Accessors During init and dealloc

Options:
SetterInvocationInInitOrDealloc.applyToInit
在init方法应用,默认yes,如果init里有setter调用则抛出警告

SetterInvocationInInitOrDealloc.applyToDealloc
在dealloc方法应用,默认yes,如果dealloc里有setter调用则抛出警告

SetterInvocationInInitOrDealloc.onlyIfIvarAvailable
只对一个匹配setter的实例变量是可用的时候则抛出警告,默认yes

SetterInvocationInInitOrDealloc.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ArgumentModification

修改一个参数变量的值

Tags(点击tag可跳转): Recommended , BestPractice

参数变量的值不能直接修改 - 如果总是相信参数变量是不会改变的,这样使得代码更容易跟踪

Options:
ArgumentModification.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


FastEnumElementOutside

快速循环遍历的元素在循环外已被声明

Tags(点击tag可跳转): Recommended , BestPractice

快速遍历里的元素不能被循环以外的元素持有,所以不允许在遍历循环外有效

Options:
FastEnumElementOutside.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnusedErrorValue

未使用的错误值

Tags(点击tag可跳转): Recommended , BestPractice

当NSError或CFErrorRef变量值没有被使用就抛出警告

如果你不关注方法返回的错误信息,则可以在参数里传入NULL

Options:
UnusedErrorValue.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


CopyingMutableProperty

复制可变类型的property

Tags(点击tag可跳转): Recommended , BestPractice

如果一个通用可变property有一个不可变的父类,且指定是copy属性,(例如NSMutableArray)则抛出警告

-[NSCopying copy]这个方法将会返回一个不可变的备份,意味着如果指定一个可变对象的属性是copy,他将会得到一个不可变的备份,在一些需要修改对象的场景下会崩溃(即用户以为是可变的,其实拷贝之后是不可变的,此时修改导致崩溃)

Options:
CopyingMutableProperty.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ImplicitBundleId

隐式bunlde id

Tags(点击tag可跳转): Recommended, Config, BestPractice

推荐选择一个非默认的bundle id值 : 在发布到App Store之前必须在iTunes Connect中选中一个精确的符合项目定义的值(Xcode依赖PRODUCT_NAME变量会默认生成一个bundle id).

Options:
ImplicitBundleId.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnnecessaryNibMethod

不成功的Nib方法

应用于app的target

Tags(点击tag可跳转): Recommended

如果-[NSObject awakeFromNib]在类中实现了,但是没有任何已知的xib文件时报出警告

Options:
UnnecessaryNibMethod.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


AssociatedObjectOnValueType

把对象关联在value-like类型上

Tags(点击tag可跳转): Recommended, BestPractice

当关联对象依附于value-like类型的对象(例如NSNumber或者UIFont)时抛出警告

这些类的实例因为数据去重(de-duplication)和伪指针(tagged pointers)的原因,可能被共享和永远存在,

补充阅读:
Michael Tsai: Associated Objects on Value Types

Options:
AssociatedObjectOnValueType.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


OrderedPointerToZeroComparison

指针和零的有序比较

Tags(点击tag可跳转): Recommended

当使用有序比较操作符对指针和零进行比较时,抛出警告

Clang编译器会对除了零的相似的比较报警

Options:
OrderedPointerToZeroComparison.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


PrefixHeaderIncludeSuggestion

将相同的头包含文件添加到prefix文件中

适用于使用prefix,且至少有10个文件的项目

Tags(点击tag可跳转): Recommended, BestPractice

通常将同样需要包含的头文件移到预编译头文件里,提高编译效率

Options:
PrefixHeaderIncludeSuggestion.showFiles
(Boolean. Default: no)
显示包含的头文件(在诊断的描述里,展示文件包含的list)

PrefixHeaderIncludeSuggestion.warningThresholdPercent
(Positive integer. Default: 30)
报警的阈值百分比(源代码文件包含了多少)

PrefixHeaderIncludeSuggestion.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ReleaseBuildCompilerArgs

有问题的发布版构建编译参数

应用于发布版build

Tags(点击tag可跳转): Recommended, Config

对于发布版构建,当缺失了许多预期的参数,或者出现了不希望出现的参数时会报错

Options:
ReleaseBuildCompilerArgs.requiredArguments
(Array of strings. Default: [“-DNS_BLOCK_ASSERTIONS”, “-DNDEBUG”])
所有文件必须的编译参数(当这些参数没有时报警)

ReleaseBuildCompilerArgs.disallowedArguments
(Array of strings. Default: [])
不允许的参数(当这些参数出现时报警)

ReleaseBuildCompilerArgs.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


XcconfigOverwrites

Xcode编译配置文件被之前的赋值覆盖

Tags(点击tag可跳转): Recommended, Config, BestPractice

在编译配置文件里覆盖一个之前的值经常是错误产生的标志

推荐在父配置中去设置自定义中间值,然后在子配置文件中形成最终值

Options:
XcconfigOverwrites.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


BuildSettingSelfReference

引用自身的Xcode配置设定

Tags(点击tag可跳转): Recommended, Config

编译设置不能引用自身。 关键字$(inherited) 应该用于在一个继承的值上拼接字符串, 以及自定义中间编译设置关键字应该用于在.xcconfig文件里拼接组合多个定义

Options:
BuildSettingSelfReference.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


BuildSettingPlacement

构建设置的值的错误位置

Tags(点击tag可跳转): Recommended, Config

当预处理定义使用-D参数被明确定义,而不是使用GCC_PREPROCESSOR_DEFINITIONS(预处理宏)时报错

如果non-warning关键词定义在WARNING_CFLAGS里而不是OTHER_CFLAGS里时,也会报错

Options:
BuildSettingPlacement.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


TerminatingApp

在release版本里结束app

适用于release版本

Tags(点击tag可跳转): Recommended, BestPractice

The iOS Human Interface Guidelines说不能发布版里程序性故意退出iOS app

补充阅读:
Technical Q&A QA1561: How do I programmatically quit my iOS application?

Options:
TerminatingApp.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


FixedFormatDateFormatter

使用固定格式的NSDateFormatter而没有使用不变的(POSIX)语言环境设置

Tags(点击tag可跳转): Recommended, APIUsage

当一个NSDateFormatter使用固定格式的日期而没有使用不变的”en_US_POSIX”设置语言环境时报错。如果用了其他的语言环境,这个日期格式字符串可能会被覆盖,这依赖于系统日期和时间设置

应该用用户可视日期,日期和时间风格,而不是设置日期格式

补充阅读:
Technical Q&A QA1480: NSDateFormatter and Internet Dates

Data Formatting Guide: Date Formatters: Parsing Date Strings

Options:
FixedFormatDateFormatter.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


AbsPathInBuildSetting

构建设置里使用绝对路径

Tags(点击tag可跳转): Recommended, Config

项目构建配置不应该包含绝对路径,当项目移动到别的开发者电脑时会出现问题

Options:
AbsPathInBuildSetting.allowSystemPaths
(Boolean. Default: no)
允许系统路径(当引用系统路径时不报错)

AbsPathInBuildSetting.allowedPathRegexes
(Array of regular expression strings. Default: )
允许的路径的正则表达式(当路径匹配这个正则时不报错)

AbsPathInBuildSetting.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


PrivateCategory

用Category扩展私有的属性

Tags(点击tag可跳转): Recommended, BestPractice

类扩展应该被替代,不应该用于私有属性(例如readonly),因为它们实现了不能实现的方法会导致报出警告

补充阅读:
Programming with Objective-C: Customizing Existing Classes

Options:
PrivateCategory.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


FileRefWithAbsPath

项目使用绝对路径引用文件

Tags(点击tag可跳转): Recommended, Config

项目不应该包含绝对路径的文件引用,在迁移到其他开发的电脑上会出问题

Options:
FileRefWithAbsPath.allowSystemPaths
(Boolean. Default: no)
允许系统路径(当引用系统路径时不报错)

FileRefWithAbsPath.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MissingImageResolutionVariant

找不到对应分辨率的图片

Tags(点击tag可跳转): Recommended, Resources

当高分辨率(@2x或@3x)或者低分辨率图片找不到时报错

补充阅读:
Apple Developer: Optimizing for High Resolution

Options:
MissingImageResolutionVariant.expectedScales
(Array of numbers. Default: [“1”, “2”, “3”])
期望的分辨率倍数

MissingImageResolutionVariant.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


TranslationPunctuation

翻译的边界标点符号不对

应用于本地化项目

Tags(点击tag可跳转): Recommended, Localization

当翻译的字符串的标点符号在字符串的开始或者结束处则抛出警告

Options:
TranslationPunctuation.punctuationChars
(String. Default: “.,:;!?…。”)
匹配的标点符号

TranslationPunctuation.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


WeakReferenceToTopLevelXIBObject

弱引用顶层XIB对象

Tags(点击tag可跳转): Recommended, Resources

IBOutlet引用XIB里顶层对象本应该是strong类型的,因为要确保不会被过早回收

补充阅读:
Resource Programming Guide: Managing the Lifetimes of Objects from Nib Files

Options:
WeakReferenceToTopLevelXIBObject.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnprefixedClass

OC类没有前缀

Tags(点击tag可跳转): Recommended, Style, BestPractice

当类没有前缀时抛出警告(例如,Thing类应该命名成FPXThing)

Options:
UnprefixedClass.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


InitializeMethodCategoryOverride

在category里复写+[NSObject initialize]方法

Tags(点击tag可跳转): Recommended, BestPractice

+[NSObject initailize]方法不能在category里复写,因为其保护了要执行的最初的实现,可以用+[NSObject load]来代替

Options:
InitializeMethodCategoryOverride.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


SuspiciousDateTimeFormat

可疑的日期时间格式

Tags(点击tag可跳转): Recommended, APIUsage

本规则会对日期时间格式可能有无意中的笔误报错,例如’周-年’(大写的Y)这样的错误格式(通常是小写的y)

补充阅读:
Data Formatting Guide: Date Formatters: Use Format Strings to Specify Custom Formats: Fixed Formats

Faux Pas Issue #53: Optional warning about using “Week Year” based year instead of “Calendar Year” date format strings

Options:
SuspiciousDateTimeFormat.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ReleaseBuildConfig

有问题的发布版构建设置项

适用于发布版

Tags(点击tag可跳转): Recommended, Config

当有不清晰的有问题的构建设置的值用在发布版上时报错

例如,如果项目流仪表(program flow instrumentation)可用,编译优化等级比较低或者静态分析没有运行时

Options:
ReleaseBuildConfig.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


AssigningDelegate

delegate是assign

Tags(点击tag可跳转): Recommended, BestPractice

delegate理应是weak而不是assign,这样可以在释放时置为nil

本规则适用于ARC环境

Options:
AssigningDelegate.allowUnsafeUnretained
(Boolean. Default: no)
允许unsafe_unretained的delegate

AssigningDelegate.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnknownResourceXIBReference

XIB引用未知资源

适用于应用target

Tags(点击tag可跳转): Recommended, Resources

从硬盘里实时加载的资源本应该也存在于bundle资源里。但是和模拟器(模拟器运行在mac上,mac大小写不敏感)不一样,iOS设备大小写敏感。

Options:
UnknownResourceXIBReference.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


GlobalAndLocalizedResource

全局和本地化的资源

Tags(点击tag可跳转): Recommended, Resources

不能把一个资源文件同时全局化和本地化,因为全局化文件优先级高于语言限定资源文件,如果一个资源文件存在全局化版本,那么语言限定版本则不会返回

补充阅读:
Bundle Programming Guide: Accessing a Bundle’s Contents

Options:
GlobalAndLocalizedResource.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnknownResourceModifier

未知的资源文件名称调节器

Tags(点击tag可跳转): Recommended, Resources

关于特定设备资源文件的设备类型调节器(类似~iphone或者~ipad)和分辨率调节器@2x一样,必须拼写正确(大小写敏感)

补充阅读:
Resource Programming Guide: iOS Supports Device-Specific Resources

Resource Programming Guide: Specifying High-Resolution Images in iOS

Options:
UnknownResourceModifier.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


Swizzling

Method swizzling

Tags(点击tag可跳转): Recommended, BestPractice

无论何时调用OC runtime API用来改变方法实现时都会报错

补充阅读:
Stack Overflow: What are the dangers of method swizzling in Objective-C?

Options:
Swizzling.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ZeroAssignmentToPointer

把0赋给指针

Tags(点击tag可跳转): Recommended

把0赋给指针可能标识着程序员希望展现的一个错误,赋值NULL,nil或者Nil都能解决这个报错

Options:
ZeroAssignmentToPointer.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DiscardedOpaqueNotificationObserver

抛弃不透明的NSNotificationCenter观察者>

Tags(点击tag可跳转): Recommended, BestPractice

如果-[NSNotificationCenter addObserverForName:object:queue:usingBlock:]的返回值不被存储起来则报错,因为要停止观察就需要用到这个方法返回的观察者对象

Options:
DiscardedOpaqueNotificationObserver.suppressViaVoidCast
(Boolean. Default: yes)
如果明确的抛出void返回值则不会报错

DiscardedOpaqueNotificationObserver.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DylibInstallName

动态链接库安装名称

适用于OS X target

Tags(点击tag可跳转): Recommended, Config

如果动态链接库的安装名称是绝对路径时报错(可以用@loader_path,@executable_path或@rpath代替)

你可以用install_name_tool来改变动态链接库的安装名称

补充阅读:
Mike Ash: Friday Q&A 2009-11-06: Linking and Install Names

Dynamic Library Programming Topics

Options:
DylibInstallName.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


TranslationFormatMismatch

翻译格式错误

适用于本地化项目

Tags(点击tag可跳转): Recommended, Localization

当相同的key对应翻译不同的语言但是不匹配规定的格式时报错

Options:
TranslationFormatMismatch.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

SuspiciousMissingResources

疑似丢失的资源文件

Tags(点击tag可跳转): Recommended, Resources

当项目包含未知类型的文件,然而target的资源里没有其引用,则报错

Options:
SuspiciousMissingResources.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ErrorConditionCheck

脆弱的错误检查条件

Tags(点击tag可跳转): Recommended, BestPractice , APIUsage

回传NSError对象的指针的方法返回NO或者nil来指明错误条件。这个规则会对如果NSError指针是nil但是没有检查返回值的情况报警

补充阅读:
Error Handling Programming Guide: Using and Creating Error Objects:Handling Error Objects Returned From Methods

Programming with Objective-C: Dealing with Errors: Some Methods Pass Errors by Reference

NYTimes Objective-C Style Guide: Error Handling

Options:
ErrorConditionCheck.onlySystemFrameworks
(Boolean. Default: no)
适用于系统框架的方法,不是系统的方法则不报错

framework header.)
ErrorConditionCheck.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


RedundantInclude

多余的头文件

适用于使用prefix预编译头文件的项目

Tags(点击tag可跳转): Recommended, BestPractice

如果一个头文件包含在项目的预编译头文件里(pch),则不需要再被其他文件包含了

这个规则不检查头文件包含在预编译头文件的文件

Options:
RedundantInclude.ignoreSystemHeaders
(Boolean. Default: yes)
忽略系统头文件

RedundantInclude.ignoreIndirectInclusions
(Boolean. Default: no)
忽略间接包含

RedundantInclude.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ReservedPrefix

保留的符号前缀

Tags(点击tag可跳转): Recommended, Pedantic

两个字符的前缀(例如NS)是苹果系统框架的的自用前缀,用户自己的前缀应该是三个字母的

补充阅读:
Programming with Objective-C: Conventions

Options:
ReservedPrefix.allowNonOverlappingTwoCharPrefix
允许出现两个字符的前缀,只要不和已有的系统框架重复即可,默认是no(不允许)

ReservedPrefix.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


NSLogUsed

在发布版里使用了NSLog()

适用于发布版构建

Tags(点击tag可跳转): Recommended, BestPractice

Logging should be disabled in release builds (except perhaps for fatal errors).

Options:
NSLogUsed.allowMacros
(Boolean. Default: yes)
允许在宏中调用NSLog(),这使得你可以在发布版构建里可以打印错误,但是直接使用NSLog()依然会报错

NSLogUsed.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnprefixedCategoryMethod

Category方法无前缀

Tags(点击tag可跳转): Recommended, BestPractice

Category方法必须有前缀,避免和系统类产生冲突

默认情况,本规则会考虑一个方法名称增加至少三个小写字符的前缀(或者用类前缀的小写版本)

补充阅读:
Programming with Objective-C: Customizing Existing Classes

Options:
UnprefixedCategoryMethod.prefixes
(Array of strings. Default: )
允许前缀,用于category方法名称,大小写敏感

UnprefixedCategoryMethod.ignoreSetters
(Boolean. Default: yes)
忽略setter方法,不会对其报错

UnprefixedCategoryMethod.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnidiomaticAccessorNaming

不符合语言习惯的getter/setter命名

Tags(点击tag可跳转): Recommended,BestPractice,Style

如果getter命名成getSomething而不是something,会抛出警告

Options:
UnidiomaticAccessorNaming.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UncommentedLocalizedString

未注释的本地化字符串

适用于本地化项目

Tags(点击tag可跳转): Recommended, Localization

当NSLocalizedString()或者其变量没有写注释时报错

Options:
UncommentedLocalizedString.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DuplicateResource

重复资源

Tags(点击tag可跳转): Resources, Recommended

当两个文件一样时报错

Options:
DuplicateResource.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ViewControllerInitWithNibName

使用-[UIViewController initWithNibName:bundle:]在UIViewController实现之外

Tags(点击tag可跳转): Recommended, BestPractice

不建议使用-[UIViewController initWithNibName:bundle:]在子类外部来初始化UIViewController子类自身。这打破了封装(子类本应该决定使用哪个Nib),在运行期如果Nib中有错别字会导致加载不到类而崩溃

Options:
ViewControllerInitWithNibName.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


CategoryMethodConflict

互相冲突的category方法

Tags(点击tag可跳转): Recommended

一个category的方法名称和原始类的方法名称一样,在执行中可能会产生不可知的结果

补充阅读:
Programming with Objective-C: Customizing Existing Classes

Options:
CategoryMethodConflict.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


BlockAPIRetainCycle

在block里有循环引用

Tags(点击tag可跳转): Recommended, APIUsage

当block里有循环引用时(引用self)报警

Clang编译器的-Warc-retain-cycles警告会报出一般的引用循环检测,这个规则只考虑特定已知framework的API,其他不会报警

补充阅读:
Black Pixel Blog: Capturing Myself

Big Nerd Ranch: Notifications part 3 — Gotchas

Sealed Abstract: NSNotificationCenter with blocks considered harmful

Options:
BlockAPIRetainCycle.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


FileRefIgnoredInVCS

包含在版本控制系统里忽略的引用文件

应用于git管理下的项目

Tags(点击tag可跳转): Recommended, VCS

项目不应该包含已经被版本控制系统忽略的文件引用

Options:
FileRefIgnoredInVCS.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MissingNotificationCenterDetachment

没有解绑NSNotificationCenter观察者

适用于项目target的版本在iOS 9或Mac OS 10.11之前

Tags(点击tag可跳转): Recommended, APIUsage

你必须在观察者被释放之前调用-[NSNotificationCenter removeObserver:]或者-[NSNotificationCentr removeObserveer:name:object:]解除绑定

这个规则将考虑观察者引用是自身的情况,或者是自身的实例变量或者property

Options:
MissingNotificationCenterDetachment.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MallocWithoutSizeof : 没有使用sizeof分配内存

Tags(点击tag可跳转): BestPractice

sizeof操作符本该用于为任何已分配的结构体或变量获取正确的存储空间,在32位和64位系统中长度可能不同

该规则粗暴直观,可能产生误报

补充阅读:
64-Bit Transition Guide for Cocoa Touch: Converting Your App to a 64-Bit Binary: Allocate Memory Using sizeof

Options:
MallocWithoutSizeof.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ThrowingObjCException

抛出一个OC异常

Tags(点击tag可跳转): Style, BestPractice

抛出的异常不是很符合用户语言习惯,应该在额外的case里(if else之类异常情况)而不是在常规流程中

本规则帮助你执行策略避免抛出异常

补充阅读:
Google Objective-C Style Guide: Avoid Throwing Exceptions

Exception Programming Topics: Introduction to Exception Programming Topics
for Cocoa

Options:
ThrowingObjCException.allowIfSoleStatement
当异常抛出逻辑存在于常规流程中,本规则不抛出警告(默认是no,不允许存在于常规流程中)

ThrowingObjCException.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


NonTypedefBlockDeclaration

声明一个block没有用typedef

Tags(点击tag可跳转): Style, BestPractice

为了可读性,推荐要把所有block声明都用typedef标记(例如:typedef void(^didFinishBlock) (NSObject *ob); )

Options:
NonTypedefBlockDeclaration.onlyArguments
(Boolean. Default: yes)
只用于函数/方法的参数(默认是yes)

NonTypedefBlockDeclaration.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


InstanceMethodWritesToStaticVariable

实例方法写在静态变量上>

Tags(点击tag可跳转): BestPractice

写入实例方法上的静态变量(基本是全局状态)通常是一种坏的方式,因为当多个实例都要修改的时候,很容易导致不可预知的行为

当在dispatch_once()里写入通常不会报错

Options:
InstanceMethodWritesToStaticVariable.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


IBOutletsInPublicInterface

在公共接口里的IBOutlet

Tags(点击tag可跳转): BestPractice

IBOutlet通常是是私有的,应该放在私有类扩展里

本规则报错的条件是:当类是XIB的”File’s Owner”时,其名字和类名一样,且包含关联的outlet

补充阅读:
WWDC 2012 Session video “Migrating to Modern Objective-C”

Options:
IBOutletsInPublicInterface.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ImplicitAtomicProperty

隐式原子property

Tags(点击tag可跳转): BestPractice

当时隐式原子性Property时报错

如果一个property没有指定原子性(atomic)或者非原子性(nonatomic),这个property是默认原子性的

补充阅读:
Programming with Objective-C: Encapsulating Data

Big Nerd Ranch: Property Values

Options:
ImplicitAtomicProperty.applyOnlyToUIClasses
(Boolean. Default: yes)
只适用于UIKit/AppKit子类

ImplicitAtomicProperty.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MacroLiteral

宏定义字符串or数字

Tags(点击tag可跳转): Style, BestPractice

应该用常量来代替用宏表示字符串或数字,这使得常量范围更加准确,且不能重复定义。

补充阅读:
Coding Guidelines for Cocoa: Naming Properties and Data Types: Constants:
Other types of constants

Options:
MacroLiteral.allowedLiterals
当宏定义这些值时,不抛出警告,默认是[“0”,”1”]

MacroLiteral.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


MallocCast

抛弃malloc()的返回值

Tags(点击tag可跳转): BestPractice, Pedantic

在C语言里,不推荐抛弃malloc()的返回值(跟内存分配函数相关),本规则会忽略在C++(或OC++)模式下编译的编译单元编译的情况

补充阅读:
Stack Overflow: Do I cast the result of malloc?

CERT Secure Coding: MEM02-C. Immediately cast the result of a memory
allocation function call into a pointer to the allocated type (Note:
Advises against this rule!)

Options:
MallocCast.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnusedResource

未使用的资源文件

Tags(点击tag可跳转): Resources

资源文件没有在代码和XIB中引用,则报错

Options:
UnusedResource.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


XIBUnknownClassReference

XIB指向未知的类

Tags(点击tag可跳转): Resources

当一个IB文件指向未知的OC类则报错

规则将对所有的没有在源代码里声明指向类或者导出到已链接库的情况报错

Options:
XIBUnknownClassReference.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


BuildSettingsSetInGUI

Build settings set in Xcode GUI
(Applies to projects that use Xcode build configuration files.)
Tags(点击tag可跳转): Config

Enable this rule if you want to set all of your build configuration values in
.xcconfig files, and get warnings whenever something gets accidentally set in
the GUI.

Options:
BuildSettingsSetInGUI.allowedGUISettings
(Array of strings. Default: [“CODE_SIGN_IDENTITY”, “PROVISIONING_PROFILE”])
Which settings are allowed to be set in the GUI
(Some settings are difficult to set in .xcconfig files.)
BuildSettingsSetInGUI.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnusedTranslation

未使用的翻译

适用于本地化项目

Tags(点击tag可跳转): Localization

代码里没有加载资源文件里的文案时,抛出警告Warns about entries in string resource files that are not directly loaded in
code (using NSLocalizedString and its variants).

Options:

UnusedTranslation.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

_LocalizationRules.localizedStringRoutines
(Array of strings. Default: [])
Functions used in place of NSLocalizedString
(The first argument is assumed to be the string key.)


APIAvailability

项目最低支持的版本无法使用该API

Tags(点击tag可跳转): APIUsage

当该API在项目支持的最低版本上依然无法使用时会抛出警告

Options:
APIAvailability.avoidFalsePositives
(Boolean. Default: yes)
避免误报,如果在合适的位置检查API发现看起来像实时API,就会压制警告的抛出

APIAvailability.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


StrongInsteadOfRetain

在ARC中使用retain

Tags(点击tag可跳转): Style

ARC模式下的文件,如果使用retain来标识property,本规则会抛出警告

strong和retain属性功能上基本一致,但前者更符合ARC语言习惯

补充阅读:
Transitioning to ARC Release Notes: ARC Introduces New Lifetime Qualifiers

Options:
StrongInsteadOfRetain.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


OrderedComparisonOpDirection

比较操作符的方向

Tags(点击tag可跳转): Style

如果使用 > 或 >= (应该用 < 或 <= 代替)则抛出警告,因为小一点的数在左边会更加易读

Options:
OrderedComparisonOpDirection.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


NewInitializer

截断初始化方法

Tags(点击tag可跳转): Style

许多人更喜欢用[NSObject new]来代替[[NSObject alloc] init],反之亦然

补充阅读:
Stack Overflow: Use of alloc init instead of new

Options:
NewInitializer.preferAllocInit
默认为yes,优先alloc-init风格,当用new代替alloc init时抛出警告

NewInitializer.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


Spelling

拼写错误

只能适用于安装有en_US或en_GB字典的系统上

Tags(点击tag可跳转): Style, Pedantic

拼写错误时抛出警告

本规则期望代码符号名称是用英语显示的(US / GB)

Options:
Spelling.knownWords
(自定义词汇的数组,默认是空,大小写不敏感)

Spelling.checkOnlyPublicInterfaces
只检查公开接口,默认是no

Spelling.checkVariablesAndParameters
检查变量和属性,默认是no

Spelling.checkCFunctions
检查c函数,默认是no

Spelling.minWordLength
最小单词长度,默认5,必须正数,短于这个数的不提示警告

Spelling.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


SourceFileHeaderComment

源文件头部注释格式

Tags(点击tag可跳转): Style, Pedantic

源文件头部注释(默认是Xcode模板样式)发生错误的时候抛出异常,例如,注释中的文件名称不匹配实际的文件名称或者还是占位符“MyCompanyName

Options:
SourceFileHeaderComment.expectCommentToStartWithFilename
(Boolean. Default: yes)
期望注释以文件名称开头,默认是yes,如果头注释的第一行不是文件的名称则抛出警告

SourceFileHeaderComment.requireHeaderComments
所有文件都强制要有头注释,默认是no,否则抛出警告

SourceFileHeaderComment.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DotSyntax

使用点语法

Tags(点击tag可跳转): Style

当用obj.foo 或 obj.foo = x替换了[obj foo] 或 [obj setFoo:x]时抛出警告

Can also be configured to enforce dot syntax only for accessors declared with
the @property syntax.

Options:
DotSyntax.onlyForProperties
只允许点语法应用在property上,默认yes,如果方括号语法访问property或者点语法访问非property,都会抛出警告

DotSyntax.allowedMethods
方括号语法白名单,列表默认是[“alloc”, “new”, “autorelease”, “release”, “retain”, “runModal”, “becomeFirstResponder”, “setNeedsDisplay:”]

DotSyntax.allowConstructors
允许工厂方法使用方括号语法访问,例如+[NSArray array],默认是yes

DotSyntax.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


IdentifierNaming

标识符命名

Tags(点击tag可跳转): Style

这个规则允许通过正则表达式为不同的标识符执行自定义命令规范

Options:
IdentifierNaming.ivarNameFormat
描述变量名称的正则表达式,默认是”^_.+”

IdentifierNaming.localVarNameFormat
函数和方法中的本地变量命名格式的正则表达式,默认是”^[^_].*”

IdentifierNaming.functionNameFormat
函数名命名格式的正则表达式,默认是空

IdentifierNaming.typedefNameFormat
typedef命名的正则表达式格式,默认是空

IdentifierNaming.macroNameFormat
宏命名的正则表达式格式,默认是空

IdentifierNaming.objcMethodNameFormat
OC方法命名的正则表达式格式,默认是空

IdentifierNaming.objcClassNameFormat
OC类命名的正则表达式格式,默认是空

IdentifierNaming.objcCategoryNameFormat
OC的category命名的正则表达式格式,默认是空

IdentifierNaming.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UnusedMethod

未使用的方法

Tags(点击tag可跳转): Pedantic

当OC方法没有被使用,则抛出警告

本规则会忽略IBAction方法,初始化方法,公用方法(指的是定义在头文件、”X+private.h”等文件的方法)、未使用的getter方法 or setter方法

Options:
UnusedMethod.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


ReservedIdentifierNaming

标识符名字使用保留字

Tags(点击tag可跳转): Pedantic

当标识符名称的命名使用了C标准或POSIX规定的保留字时抛出警告

Options:
ReservedIdentifierNaming.checkCStandard
检查标识符名称是否使用了C标准的保留字,默认yes(标识符名称以两个下划线开头或者一个下划线和一个小写)

ReservedIdentifierNaming.checkPOSIXStandard
检查标识符名称是否使用了POSIX的保留字,默认yes(标识符名称以“_t”结尾)

ReservedIdentifierNaming.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

CyclomaticComplexity

圈复杂度

Tags(点击tag可跳转): Pedantic

当程序拥有高圈复杂度时抛出警告(圈复杂度:源码的线性依赖路径)

补充阅读:
Wikipedia: Cyclomatic complexity

NIST Special Publication 500-235: Structured Testing: A Testing
Methodology Using the Cyclomatic Complexity Metric

Options:
CyclomaticComplexity.warningThresholdCCN
圈复杂度警告阈值,必须是正数,默认是10,圈复杂度大于该值时抛出警告

CyclomaticComplexity.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


DefaultInExhaustiveSwitch

覆盖了所有可能值的switch中的默认case

Tags(点击tag可跳转): Pedantic

如果一个switch条件语句明确的处理了所有的可能值,那么默认的case必然是永无执行之日,可能会导致开发者阅读这没有执行的代码

如果添加默认case的目的是为了防止枚举警告,但是可能导致在switch中无法掌控(推荐是如果遍历了全部的可能性,则不再添加default case),编译器警告-Wswitch-enum可以替代这样的方式

Options:
DefaultInExhaustiveSwitch.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)


UsedVariableMarkedUnused

使用一个已被强制标记为未使用的变量

Tags(点击tag可跳转): Pedantic

当一个变量被强制标记上未使用的属性,但是实际上却使用了,则会抛出警告。本规则会忽略通过progma指令标记的情况

Options:
UsedVariableMarkedUnused.ignoredFileRegexes
(设置要忽略的文件路径的正则表达式,值为正则表达式字符串的数组,正则表达式匹配的是需要忽略的文件的完成路径,默认是)

tag列表

tag一共9类,分别是Recommended/BestPractice/Resources/Config/Localization/APIUsage/VCS/Style/Pedantic,点击查看tag详情

推荐的常用设置,本tag共86条规则

UndetachedDelegate : 未解绑的delegate

InvalidStringsFile : 应用于本地化项目的无效字符串资源文件

StringsFileEncoding : 字符串资源文件不是UTF-8编码

UIKitKVO : 使用KVO观察UIKit对象

UnnecessaryNullCheck : 在free()调用前检查多余的NULL

RetinaImagesResolution : 非预期的高清图片分辨率

AssertionSideEffects : 断言的副作用

SuspiciousResources : 可疑的bundle资源

NullCoalescingOp : 和空对象合并操作

LoadMethodWithoutAutoreleasePool : [NSObject load]方法中没有@autoreleasepool

UnknownResourceCodeReference : 代码引用未知资源

StringsdictWithoutStrings : .stringdict文件没有匹配.string文件

InitializeSuperInvocation : +[NSObject initialize]调用了super方法

CompilerWarnings : 推荐的编译警告选项

UnsupportedWeakReference : 将一个不能weak的对象指定为weak属性

HardcodedUIString : UI 字符串没有本地化

HardcodedSelfClass : 硬编码自身类引用

MacroBasedIncludeGuard : 用宏保障#include引用一次

RestrictedDirectMethodCall : 限制直接方法调用

RecommendedVCSIgnores : 推荐的版本控制系统忽略项

RetainingImmutableProperty : 没复制不可变property

CompleteNotificationCenterDetachment : 解除NSNotificationCenter绑定

MissingAPIUsageDescription : 缺少API使用描述

XIBRuntimeAttributeMismatch : XIB实时属性不匹配

ThreadUnsafeInstanceCaching : 全局持有一个线程不安全的类实例

MissingTranslation : 翻译缺失

RestrictedMethodOverride : 覆盖受限方法

MissingDeviceTypeResource : 缺少对应设备类型的资源

OldVerboseObjCSyntax : 废旧OC语句

ViewLayoutInXIB : XIB中错误的view layout

IsEqualAndHash : 实现了-isEqual但是没有实现-hash

FileRefOutsideVCS : 项目引用文件没有进入版本控制系统

LiteralStringKeyPath : 传字符串作为keypath

BasicProjectSettings : 推荐的项目设置

DuplicateTranslation : 重复的翻译

StrongDelegate : retain或copy delegate

ConstructorReturnType : 构造器返回类型

SetterInvocationInInitOrDealloc : 在init或者dealloc里调用setter方法

ArgumentModification : 修改一个参数变量的值

FastEnumElementOutside : 快速循环遍历的元素在循环外已被声明

UnusedErrorValue : 未使用的错误值

CopyingMutableProperty : 复制可变类型的property

ImplicitBundleId : 隐式bunlde id

UnnecessaryNibMethod : 不成功的Nib方法

AssociatedObjectOnValueType : 把对象关联在value-like类型上

OrderedPointerToZeroComparison : 指针和零的有序比较

PrefixHeaderIncludeSuggestion : 将相同的头包含文件添加到prefix文件中

ReleaseBuildCompilerArgs : 有问题的发布版构建编译参数

XcconfigOverwrites : Xcode编译配置文件被之前的赋值覆盖

BuildSettingSelfReference : 引用自身的Xcode配置设定

BuildSettingPlacement : 构建设置的值的错误位置

TerminatingApp : 在release版本里结束app

FixedFormatDateFormatter : 使用固定格式的NSDateFormatter而没有使用不变的(POSIX)语言环境设置

AbsPathInBuildSetting : 构建设置里使用绝对路径

PrivateCategory : 用Category扩展私有的属性

FileRefWithAbsPath : 项目使用绝对路径引用文件

MissingImageResolutionVariant : 找不到对应分辨率的图片

TranslationPunctuation : 翻译的边界标点符号不对

WeakReferenceToTopLevelXIBObject : 弱引用顶层XIB对象

UnprefixedClass : OC类没有前缀

InitializeMethodCategoryOverride : 在category里复写+[NSObject initialize]方法

SuspiciousDateTimeFormat : 可疑的日期时间格式

ReleaseBuildConfig : 有问题的发布版构建设置项

AssigningDelegate : delegate是assign

UnknownResourceXIBReference : XIB引用未知资源

GlobalAndLocalizedResource : 全局和本地化的资源

UnknownResourceModifier : 未知的资源文件名称调节器

Swizzling : Method swizzling

ZeroAssignmentToPointer : 把0赋给指针

DiscardedOpaqueNotificationObserver : 抛弃不透明的NSNotificationCenter观察者

DylibInstallName : 动态链接库安装名称

TranslationFormatMismatch : 翻译格式错误

SuspiciousMissingResources : 疑似丢失的资源文件

ErrorConditionCheck : 脆弱的错误检查条件

RedundantInclude : 多余的头文件

ReservedPrefix : 保留的符号前缀

NSLogUsed : 在发布版里使用了NSLog()

UnprefixedCategoryMethod : Category方法无前缀

UnidiomaticAccessorNaming : 不符合语言习惯的getter/setter命名

UncommentedLocalizedString : 未注释的本地化字符串

DuplicateResource : 重复资源

ViewControllerInitWithNibName : 使用-[UIViewController initWithNibName:bundle:]在UIViewController实现之外

CategoryMethodConflict : 互相冲突的category方法

BlockAPIRetainCycle : 在block里有循环引用

FileRefIgnoredInVCS : 包含在版本控制系统里忽略的引用文件

MissingNotificationCenterDetachment : 没有解绑NSNotificationCenter观察者

BestPractice

最佳实践,本tag下共44条规则

UndetachedDelegate : 未解绑的delegate

StringsFileEncoding : 字符串资源文件不是UTF-8编码

MallocWithoutSizeof : 没有使用sizeof分配内存

AssertionSideEffects : 断言的副作用

LoadMethodWithoutAutoreleasePool : [NSObject load]方法中没有@autoreleasepool

InitializeSuperInvocation : +[NSObject initialize]调用了super方法

CompilerWarnings : 推荐的编译警告选项

HardcodedSelfClass : 硬编码自身类引用

MacroBasedIncludeGuard : 用宏保障#include引用一次

ThrowingObjCException : 抛出一个OC异常

RetainingImmutableProperty : 没复制不可变property

CompleteNotificationCenterDetachment : 解除NSNotificationCenter绑定

OldVerboseObjCSyntax : 废旧OC语句

BasicProjectSettings : 推荐的项目设置

StrongDelegate : retain或copy delegate

ConstructorReturnType : 构造器返回类型

SetterInvocationInInitOrDealloc : 在init或者dealloc里调用setter方法

ArgumentModification : 修改一个参数变量的值

FastEnumElementOutside : 快速循环遍历的元素在循环外已被声明

NonTypedefBlockDeclaration : 声明一个block没有用typedef

UnusedErrorValue : 未使用的错误值

CopyingMutableProperty : 复制可变类型的property

InstanceMethodWritesToStaticVariable : 实例方法写在静态变量上

ImplicitBundleId : 隐式bunlde id

AssociatedObjectOnValueType : 把对象关联在value-like类型上

PrefixHeaderIncludeSuggestion : 将相同的头包含文件添加到prefix文件中

XcconfigOverwrites : Xcode编译配置文件被之前的赋值覆盖

TerminatingApp : 在release版本里结束app

PrivateCategory : 用Category扩展私有的属性

IBOutletsInPublicInterface : 在公共接口里的IBOutlet

UnprefixedClass : OC类没有前缀

InitializeMethodCategoryOverride : 在category里复写+[NSObject initialize]方法

ImplicitAtomicProperty : 隐式原子property

MacroLiteral : 宏定义字符串or数字

AssigningDelegate : delegate是assign

Swizzling : Method swizzling

DiscardedOpaqueNotificationObserver : 抛弃不透明的NSNotificationCenter观察者

MallocCast : 抛弃malloc()的返回值

ErrorConditionCheck : 脆弱的错误检查条件

RedundantInclude : 多余的头文件

NSLogUsed : 在发布版里使用了NSLog()

UnprefixedCategoryMethod : Category方法无前缀

UnidiomaticAccessorNaming : 不符合语言习惯的getter/setter命名

ViewControllerInitWithNibName : 使用-[UIViewController initWithNibName:bundle:]在UIViewController实现之外

Resources

静态资源,本tag下共14条规则

RetinaImagesResolution : 非预期的高清图片分辨率

SuspiciousResources : 可疑的bundle资源

UnknownResourceCodeReference : 代码引用未知资源

UnusedResource : 未使用的资源文件

XIBUnknownClassReference : XIB指向未知的类

XIBRuntimeAttributeMismatch : XIB实时属性不匹配

MissingDeviceTypeResource : 缺少对应设备类型的资源

MissingImageResolutionVariant : 找不到对应分辨率的图片

WeakReferenceToTopLevelXIBObject : 弱引用顶层XIB对象

UnknownResourceXIBReference : XIB引用未知资源

GlobalAndLocalizedResource : 全局和本地化的资源

UnknownResourceModifier : 未知的资源文件名称调节器

SuspiciousMissingResources : 疑似丢失的资源文件

DuplicateResource : 重复资源

Config

系统配置,本tag下共14条规则

BuildSettingsSetInGUI

CompilerWarnings : 推荐的编译警告选项

MissingAPIUsageDescription : 缺少API使用描述

ViewLayoutInXIB : XIB中错误的view layout

BasicProjectSettings : 推荐的项目设置

ImplicitBundleId : 隐式bunlde id

ReleaseBuildCompilerArgs : 有问题的发布版构建编译参数

XcconfigOverwrites : Xcode编译配置文件被之前的赋值覆盖

BuildSettingSelfReference : 引用自身的Xcode配置设定

BuildSettingPlacement : 构建设置的值的错误位置

AbsPathInBuildSetting : 构建设置里使用绝对路径

FileRefWithAbsPath : 项目使用绝对路径引用文件

ReleaseBuildConfig : 有问题的发布版构建设置项

DylibInstallName : 动态链接库安装名称

Localization

本地化,本tag下共10条规则

InvalidStringsFile : 应用于本地化项目的无效字符串资源文件

StringsFileEncoding : 字符串资源文件不是UTF-8编码

UnusedTranslation : 未使用的翻译

StringsdictWithoutStrings : .stringdict文件没有匹配.string文件

HardcodedUIString : UI 字符串没有本地化

MissingTranslation : 翻译缺失

DuplicateTranslation : 重复的翻译

TranslationPunctuation : 翻译的边界标点符号不对

TranslationFormatMismatch : 翻译格式错误

UncommentedLocalizedString : 未注释的本地化字符串

APIUsage

API调用,本tag下共11条规则

UIKitKVO : 使用KVO观察UIKit对象

APIAvailability : 项目最低支持的版本无法使用该API

RestrictedDirectMethodCall : 限制直接方法调用

RestrictedMethodOverride : 覆盖受限方法

IsEqualAndHash : 实现了-isEqual但是没有实现-hash

LiteralStringKeyPath : 传字符串作为keypath

FixedFormatDateFormatter : 使用固定格式的NSDateFormatter而没有使用不变的(POSIX)语言环境设置

SuspiciousDateTimeFormat : 可疑的日期时间格式

ErrorConditionCheck : 脆弱的错误检查条件

BlockAPIRetainCycle : 在block里有循环引用

MissingNotificationCenterDetachment : 没有解绑NSNotificationCenter观察者

VCS

版本控制,本tag下共4条规则

StringsFileEncoding : 字符串资源文件不是UTF-8编码

RecommendedVCSIgnores : 推荐的版本控制系统忽略项

FileRefOutsideVCS : 项目引用文件没有进入版本控制系统

FileRefIgnoredInVCS : 包含在版本控制系统里忽略的引用文件

Style

代码风格,本tag下共14条规则

NullCoalescingOp : 和空对象合并操作

StrongInsteadOfRetain : 在ARC中使用retain

OrderedComparisonOpDirection : 比较操作符的方向

ThrowingObjCException : 抛出一个OC异常

OldVerboseObjCSyntax : 废旧OC语句

NewInitializer : 截断初始化方法

NonTypedefBlockDeclaration : 声明一个block没有用typedef

Spelling : 拼写错误

SourceFileHeaderComment : 源文件头部注释格式

UnprefixedClass : OC类没有前缀

DotSyntax : 使用点语法

IdentifierNaming : 标识符命名

MacroLiteral : 宏定义字符串or数字

UnidiomaticAccessorNaming : 不符合语言习惯的getter/setter命名

Pedantic

学究,本tag下共10条规则

UnnecessaryNullCheck : 在free()调用前检查多余的NULL

Spelling : 拼写错误

SourceFileHeaderComment : 源文件头部注释格式

UnusedMethod : 未使用的方法

ReservedIdentifierNaming : 标识符名字使用保留字

CyclomaticComplexity : 圈复杂度

DefaultInExhaustiveSwitch : 覆盖了所有可能值的switch中的默认case

MallocCast : 抛弃malloc()的返回值

ReservedPrefix : 保留的符号前缀

UsedVariableMarkedUnused : 使用一个已被强制标记为未使用的变量

补充说明

1. #pragma once与 #ifndef的区别

为了避免同一个文件被include多次

1 #ifndef方式

2 #pragma once方式

在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。

1
2
3
4
5
6
7
8
9
10
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
方式二:
#pragma once
... ... // 一些声明语句

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况

#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

方式一由语言支持所以移植性好,方式二 可以避免名字冲突

参考资料

Fauxpas文档

分享