Clang Attributes 是 Clang 提供的一种源码注解,方便开发者向编译器表达某种要求,参与控制如 Static Analyzer、Name Mangling、Code Generation 等过程,一般以__attribute__(xxx) 的形式出现在代码中;为方便使用,一些常用属性也被 Cocoa 定义成宏,比如在系统头文件中经常出现的NS_CLASS_AVAILABLE_IOS(9_0) 就是 __attribute__(availability(...)) 这个属性的简单写法。

常见属性的介绍,可以看 NSHipster 的介绍文章 和的 twitter 的介绍文章。本文还会介绍几个有意思的“黑魔法” Attribute,说不定在某些场景下会起到意想不到的效果哦~

以下测试都以 Xcode 7.3 ( Clang 3.8 ) 为准

objc_subclassing_restricted

使用这个属性可以定义一个 Final Class,也就是说,一个不可被继承的类,假设我们有个名叫 Eunuch(太监) 的类,但并不希望有人可以继承自它:

@interface Eunuch : NSObject
@end
@interface Child : Eunuch // 太监不能够有孩砸
@end


只要在 @interface 前面加上 objc_subclassing_restricted 这个属性即可:

__attribute__((objc_subclassing_restricted))
@interface Eunuch : NSObject
@end
@interface Child : Eunuch // <--- Compile Error
@end

objc_requires_super

aka: NS_REQUIRES_SUPER,标志子类继承这个方