方法Swizzling - 如何确保方法在被调用之前被调整

时间:2011-01-13 00:22:20

标签: objective-c swizzling

我正在使用SIMBL调整NSMenuItems的第三方应用程序创建方法,但是在我的方法调配初始化之前创建菜单项的时间是50/50。

什么是一种干净的方法来确保我的调酒始终是第一位的?我想我可以调整applicationDidFinishLaunching:继续我在那里的调整。但是我担心我会遇到同样的错误,在我的实际调酒到位之前将调用applicationDidFinishLaunching。

约翰

2 个答案:

答案 0 :(得分:2)

你想要在加载库后立即发生混合。您可以通过+initialize+load或构造函数执行此操作。

@ bbum的answer to this question提供了更多信息,以及one of his blog posts关于使用这些特殊类方法的警告。

(而且我故意不质疑你所做的事情的智慧;)

答案 1 :(得分:2)

您可以使用这样的构造函数:

__attribute__((constructor)) static void do_the_swizzles()
{
    // Do all your swizzling here.
}

来自GCC documentation

  

constructor属性会调用该函数   执行前自动进入main()

注意:虽然这最初来自GCC,但它也适用于LLVM