酷酷的哀殿


  • 首页

  • 技术

  • 笔记

  • 杂记

  • Todo

  • 关于

  • 搜索
close

通过编译器预处理指令禁用调用 performSelector:方法

时间: 2021-02-21   |   阅读: 319 字 ~1分钟

本文希望介绍一个特殊的 预处理指令 #pragma clang poison ,该指令可以实现禁止调用 performSelector: 方法的诉求

performSelector:

performSelector: 是 ObjC 运行时提供的一套动态方法调用的入口。

比如,我们可以通过下面的方法,动态调用 self 的 name 方法

1
2
SEL aSelector = NSSelectorFromString(@"name");
[self performSelector:aSelector];

这种用法同样存在很多风险,比如,可能会出现内存泄露,可能因未做好参数校验导致崩溃。

所以,很多 APP 都希望严格控制项目对 performSelector: 的使用入口,避免随意的调用 performSelector: 产生崩溃

#pragma GCC poison

#pragma GCC poison 是 GCC 编译器支持的一个预处理指令,可以用于移除程序中的**identifier(标识符)**

比如,#pragma GCC poison NSLog 可以让源码出现 NSLog 相关的 identifier(标识符) 后出现报错

image-20210221224422395

clang 编译器同样支持这种写法,同时也支持将 GCC 替换成clang

所以,我们可以使用下面的预处理指令 #pragma clang poison performSelector 禁止源码中出现 performSelector

image-20210221224642391

相关推荐

  • x86_64 的 CALL 指令长度是固定的吗?
  • clang 源码导读(8)- 词法分析和预处理
  • llvm 对 copy 属性的优化(2)
  • llvm 对 copy 属性的优化(1)
#编译器# #预处理#
Xcode 小技巧:快速查看预处理后的代码
Xcode 小技巧:如何获取源码文件对应的 target?
  • 文章目录
  • 站点概览
酷酷的哀殿

酷酷的哀殿

单身狗

74 日志
83 标签
    • performSelector:
    • #pragma GCC poison
© 2021 酷酷的哀殿 京ICP备18052541号-2
Powered by - Hugo v0.80.0
Theme by - NexT
0%