__weak
这个关键字用于指导compiler 弱导出符号,__weak可用于函数和变量声明,以及函数定义
函数和变量声明
对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器出现未解析引用故障
__weak void f(void);
…
f(); // 调用 f weakly
如果对缺少的弱函数的引用是从编译为分支或分支链接指令的代码中进行的,则:
1引用被解析为分支到下一条指令。这有效地使分支成为 NOP。
2该分支被 NOP 指令取代。
函数定义
用 __weak 定义的函数会弱导出其符号。弱定义函数的行为类似于正常定义的函数,除非同名的非弱定义函数链接到同一映像中。如果非弱定义函数和弱定义函数都存在于同一映像中,则对该函数的所有调用都解析为调用非弱函数。如果有多个弱定义可用,则链接器将生成错误消息,除非使用链接器选项 --muldefweak。在这种情况下,链接器会选择一个供所有调用使用。用 __weak 声明然后不带 __weak 定义的函数表现为非弱函数。
限制
使用__weak限定函数和变量声明以及函数定义时存在一些限制。
函数和变量声明中的限制
函数或变量不能在同一编译中同时弱和非弱使用。例如,以下代码从 g() 和 h() 弱使用 f():
__weak void