1. objc_subclassing_restricted
在@ interface 前, 用__attribute__((objc_subclassing_restricted))修饰的类, 不允许继承.
2. objc_requires_super
用- (void)method __attribute__((objc_requires_super));修饰的方法, 标识着在子类继承这个方法时, 需要调用 super
3. objc_boxable
@(...) 语法糖可以将基本数据类型 box 成 NSNumber 对象,假如想 box 一个 struct 类型或是 union 类型成 NSValue 对象,可以使用这个属性:
typedefstruct__attribute__((objc_boxable)) {
CGFloatx, y, width, height;
} XXRect;
CGRect rect1 = {1, 2, 3, 4};
NSValue *value1 = @(rect1);// <--- Compile Error
XXRect rect2 = {1, 2, 3, 4};
NSValue *value2 = @(rect2); // √
4. constructor / destructor
构造器和析构器,加上这两个属性的函数会在分别在可执行文件(或 shared library)load和 unload 时被调用,可以理解为在 main() 函数调用前和 return 后执行:
PS:若有多个 constructor 且想控制优先级的话,可以写成 __attribute__((constructor(101))),里面的数字越小优先级越高,1 ~ 100 为系统保留。
__attribute__((constructor)) static void beforeMain(void) { NSLog(@"beforeMain"); } __attribute__((destructor)) static void afterMain(void) { NSLog(@"afterMain"); }
int main(int argc, const char * argv[]) {
NSLog(@"main");
return 0;
} // Console: // "beforeMain" -> "main" -> "afterMain"