iOS - Tips - 黑魔法

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"


你可能感兴趣的:(iOS - Tips - 黑魔法)