离久的小站

关于Attribute

2018/08/17 Share

Clang Attributes 是 Clang 提供的一种源码注解,一般以 attribute(xxx) 的形式出现在代码中;为方便使用,一些常用属性也被 Cocoa 定义成宏。

1.objc_subclassing_restricted

1
定义一个不可被继承的类,写在 @interface 前。

2.objc_requires_super

1
子类继承这个方法时需要调用 super,否则给出编译警告。

3.objc_boxable

1
声明的 struct 类型或是 union 等基本数据类型可以使用 @(...) 语法糖转成 NSNumber 和 NSValue。

4.constructor / destructor

1
2
3
4
5
6
7
8
9
10
11
12
13
构造器和析构器,加上这两个属性的函数会在分别在可执行文件 load 和 unload 时被调用,可以理解为在 main() 函数调用前和 return 后执行。

constructor 和 +load 都是在 main 函数执行前调用,但 +load 比 constructor 更加早一点。
因为 dyld(动态链接器,程序的最初起点)在加载 image(可以理解成 Mach-O 文件)时会先通知 objc runtime 去加载其中所有的类。
每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用这个 image 中所有的 constructor 方法。

所以 constructor 是一个干坏事的绝佳时机:

所有 Class 都已经加载完成
main 函数还未执行
无需像 +load 还得挂载在一个 Class 中

若有多个 constructor 且想控制优先级的话,可以写成 __attribute__((constructor(1))),里面的数字越小优先级越高,1 ~ 100 为系统保留。

5.cleanup

1
声明到一个变量上,当这个变量作用域结束时,调用指定的一个函数。

6.objc_runtime_name

1
用于 @interface 或 @protocol,将类或协议的名字在编译时指定成另一个。

最后附上Demo及其地址
Demo地址

CATALOG