这个仓库包含了一些使用OC控制分析[http://oclint.org]与Cocoa和Cocoa Touch一起使用时的便利功能。
OC控制分析中包含的一些检查允许您为代码注释以实现额外的安全性,这些安全性根据您的代码库进行定制。本质上,这种机制允许oclint向Objective-C添加强大的静态功能,如受保护的方法和必须由子类覆盖的抽象方法。
这个repo包含了一些使用这些检查的便利功能,以及一些利用这些检查的系统框架的注释,以正式化以前非正式的文档。
要添加这些检查到项目中以便oclint能够看到它们,需要进行三个步骤
OCLint-Annotations.h
文件添加到您的Xcode项目中。您应该在项目的.pch
预编译头文件中将它导入,使其对所有代码可见。iOS/UIKit+OCLintStaticChecks.h
添加到您包含UIKit的地方。如果该框架的系统头文件已经存在,则在该系统头文件所在的.pch
文件中放置它是个好主意。但如果您仅在特定情况下包含系统头文件,请确保除了库的标准头文件外,还包含相关的OCLintStaticChecks文件。所有这些检查都作为方法、属性或C函数声明的注释工作。此外,您还可以通过在具有附加注释的分类中重新声明它们来向已声明的函数或属性添加注释。对于C函数,只需要结合附加属性一起重复声明即可。这便是系统框架中包含注释的方式。
这些也在OCLint-Annotations.h
中进行了文档记录,您可以查看框架特定头文件以获取示例。
例如,其中一个检查允许您声明任何重写方法的函数都必须调用其超实现。这对应于注释 __attribute__((annotate("oclint:enforce[must call super]")))
。但这样做既长又容易出错,且难以记住。因此,“OCLint-Annotations.h”头文件包含以下宏
#define OCLINT_MUST_CALL_SUPER __attribute__((annotate("oclint:enforce[must call super]")))
要使用此宏,只需将其添加到方法声明的末尾。
@interface SomeClass : NSObject
- (void)someMethod OCLINT_MUST_CALL_SUPER;
@end
如果这样做,并且有子类重写了 someMethod
但没有调用 [super someMethod]
,oclint 将报告错误。如果您故意不调用它,例如在基类实现中,您可以使用标准的 oclint 抑制机制来抑制违规。我们提供了一些宏来使操作更方便。例如
@implementation SomeClass
- (void)someMethod OCLINT_SUPPRESS_MUST_CALL_SUPER {
// don't call super because it's the base class
...
}
@end
OCLINT_MUST_CALL_SUPER
,如前所述,允许您将方法标记为需要调用其超实现。一些系统框架方法以这种方式标记,即使系统超类的版本明确标记为不执行任何操作。这是为了捕获常见情况,在这些情况下,层次结构较远的子类未能调用 super。例如,在处理深层类层次结构时,子子孙类通常缺少对 viewWillAppear:
超实现的调用是常见错误,尽管在 UIViewController 中的实现文档中指出这样做不会做任何事情,因此直接的子类实际上不需要调用 super。这类似于内置的 objc_requires_super
属性,但通常可以应用于已声明的函数。
OCLINT_PROTECTED_METHOD
允许您将方法标记为受保护的。这是其他面向对象语言的概念(也出现在 ivars 上的不常用 @protected
注释)。受保护的函数是只能由该类及其子类调用的函数。
OCLINT_SUBCLASS_MUST_OVERRIDE
允许您将必须由标记声明的类的任何子类重写的函数标记为必须重写。这适用于实现抽象类。
OCLINT_PROHIBIT_CALL()
允许您将方法或 C 函数标记为禁止调用。这类似于系统框架中使用的已被弃用的属性,但您可以使用分类或重新声明在库中将系统框架标记为禁止使用。参数是一个注释,指示调用者使用什么替代方法,并在 oclint 输出中显示。
如有任何疑问,请联系 oclint 用户 Google 群组 或在 github 上创建问题。