【问题标题】:Replacing Objective-C Foundation function implementations替换 Objective-C Foundation 函数实现
【发布时间】:2013-08-21 18:12:12
【问题描述】:

有没有办法替换 Objective-C Foundation 函数的实现,例如 NSClassFromString 函数?我当然知道class_replaceMethod,但它似乎只适用于类方法而不是一般函数。

【问题讨论】:

  • 其实不相关。
  • 我认为this 是相关的,但是?
  • 您可以使用dyld 加载包含库函数的替代实现的库我相信。试试man dyld。如果你想变得更复杂,你也许可以动态找到原始实现的函数指针,这样你就可以tail/head调用它。
  • 我想如果您处于完全黑客模式,您可以使用机器指令覆盖已安装的系统功能,以跳转到您正在替换的功能的实现。您还需要在其他地方复制被替换函数的指令,修复它的跳转等,并在替换函数运行之前/之后调用该副本......但这听起来很复杂。 (虽然开发一个实现类似补丁的库可能很酷,即en.wikipedia.org/wiki/Application_Enhancer

标签: objective-c


【解决方案1】:

这些函数只是 C 函数和/或宏(Objective C 是基于 C 构建的),您不能替换 C 函数。

但是,您可以使用 define 来屏蔽名称:

Class MyNSClassFromString( NSString* blah ) {
    return whatever;
}

#define NSClassFromString MyNSClassFromString

从那时起,调用NSClassFromString(@"hi") 将调用自定义函数。请注意,这有几个限制:它不会更改高于 define 的任何代码(或您正在使用的库中的任何代码),它通常会使智能感知不愉快,并且如果定义了 NSClassFromString,它将无法工作首先作为宏(在这种情况下,您可以在定义之前添加#undef NSClassFromString)。

一般来说,我不会推荐这个,但如果你真的想要这样做,那么可能性是存在的。

【讨论】:

  • 确实可以替换函数;它被称为interposing 或插入。
  • @JoshCaswell 很好,但正如我对 nielsbot 所说,这仅适用于未内联函数的情况,这可能会在 Apple 更新 API 实现时导致一些难以维护的代码。如果函数首先是宏,它也不适用,Apple 说其中一些函数可以。
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多