有没有办法在mach_inject之后卸载bundle

时间:2013-02-09 07:48:36

标签: macos mach

我想将较新版本的bundle加载到目标进程,但这是不可能的,因为已经加载了具有相同名称的bundle。更改捆绑包的CFBundleVersionCFBundleShortVersionString不起作用。最简单的方法就是杀死目标进程并重新启动它。但我认为这不是最佳方式。那还有另一种方法吗?

1 个答案:

答案 0 :(得分:3)

我遇到了与mach_inject相同的问题。在没有修改mach_inject的情况下,我没有看到直接的解决方案。

我的解决方案是创建两个包。考虑第一个bundle是真正的插件的插件管理器。插件管理器非常简单,希望永远不需要升级,它加载和卸载添加了清理代码的原始包。

我正在使用Apple的NSBundle类来加载和卸载插件。在卸载之前,我调用原始插件中的主要类来清理它。

卸载用目标C编写的包很危险。 2&一般情况下都是如此。

  1. Mach_override无法撤消,但可以在插件管理器中调用并调用真实插件中的代码。
  2. 在要卸载的插件中使用类别和协议是不安全的。
  3. 你需要不要调整你的混音,并记住你不能删除方法,所以当你重新加载插件时,你需要替换(而不是添加)旧的悬空方法。您需要检查您的混合代码。
  4. 您需要使安装的计时器无效,删除观察者,并删除添加到运行循环中的任何其他内容。