简单地导入 header 会导致 run-time 问题吗?
Can simply importing a header ever lead to run-time issues?
我意识到这样做会导致编译错误。但是,如果没有(新的)编译错误或警告出现,导入是否总是安全的?如果我使用 import 语句(例如删除重复的协议定义警告),这样做是否可以单独改变 run-time 行为?在新的 header 导入之后,需要进行哪些检查(如果有的话)以确保操作的不变性?
是的,导入 header 会导致 run-time 个问题。
例如,您可能会收到一条警告,指出选择器未知,因此编译器正在对其签名做出假设。如果您通过导入相关 header 来修复该警告,那么这将更改编译器发出的代码。通常,它会将代码从损坏更改为正确,但这仍然会导致 run-time 更改。
如果您使用 #import
,那么 header 可以定义从根本上改变后续代码的预处理器宏。例如,它可以 #define setNeedsDisplay setHidden
或其他东西。
我能想到的验证导入 header 没有改变生成的代码的唯一方法是检查生成的代码并比较前后。您可以要求 Xcode 或 clang
从编译中生成程序集。您还可以使用 otool -tV
反汇编二进制文件(尽管这不会显示静态数据(例如字符串)的变化)。
我意识到这样做会导致编译错误。但是,如果没有(新的)编译错误或警告出现,导入是否总是安全的?如果我使用 import 语句(例如删除重复的协议定义警告),这样做是否可以单独改变 run-time 行为?在新的 header 导入之后,需要进行哪些检查(如果有的话)以确保操作的不变性?
是的,导入 header 会导致 run-time 个问题。
例如,您可能会收到一条警告,指出选择器未知,因此编译器正在对其签名做出假设。如果您通过导入相关 header 来修复该警告,那么这将更改编译器发出的代码。通常,它会将代码从损坏更改为正确,但这仍然会导致 run-time 更改。
如果您使用 #import
,那么 header 可以定义从根本上改变后续代码的预处理器宏。例如,它可以 #define setNeedsDisplay setHidden
或其他东西。
我能想到的验证导入 header 没有改变生成的代码的唯一方法是检查生成的代码并比较前后。您可以要求 Xcode 或 clang
从编译中生成程序集。您还可以使用 otool -tV
反汇编二进制文件(尽管这不会显示静态数据(例如字符串)的变化)。