【问题标题】:objective-c static library class category, override method not workingobjective-c 静态库类类别,覆盖方法不起作用
【发布时间】:2009-08-13 00:24:46
【问题描述】:

我在 iPhone 上使用 Three20,我试图通过使用类类别来更改方法在其中的作用。它编译得很好,但我从来没有达到它的断点。

我假设一个类类别会影响该类的所有实例,因此我不必重新编译静态库即可使其工作。

我也知道我用于该类别的类正在被看到,因为如果我在接口和实现该类别时在类名的末尾添加一个“x”,编译器将失败。

非常感谢这里的任何指导。

【问题讨论】:

    标签: iphone objective-c categories


    【解决方案1】:

    正如here 所指出的,您需要在应用程序的其他链接器标志中设置-all_load 选项,以便将类别与iPhone OS 3.0 中的静态库链接。 -ObjC 也可以解决问题,但它不适用于当前的 SDK。 从 Xcode 4.2 中的 LLVM 编译器开始,他们修复了阻止 -ObjC 的其他链接器标志正常工作的链接器错误,所以您不再需要使用 -all_load (它有一些讨厌的副作用)。 -ObjC 应该是您从静态库中提取类别所需的全部内容。

    这可能会导致您的问题,尽管我认为 Three20 首先需要设置这些链接器标志才能与您的应用程序正确链接,因此您可能已经有了这些标志。

    【讨论】:

    • +1 -all_load 标志帮助我解决了类似(但不相同)的问题,尽管我已经设置了 -ObjC。
    【解决方案2】:

    当两个类别覆盖同一个二进制文件中同一个类的同一个方法时,没有定义哪个覆盖优先。为了获得最佳结果,请创建一个子类,然后覆盖其上的方法。或者,由于 Three20 是 Apache 许可的,您可以在库本身中进行更改。

    【讨论】:

    • 我知道我可以更改库,但我希望快速修复,我不想研究如何重新编译静态库,但我可能不得不这样做。谢谢。
    • 一个真正快速的解决方法是使用 method_(get|set)Implementation 在运行时替换方法。
    【解决方案3】:

    我有一个链接到静态库的项目,是的,在使用 3.0 sdk 的设备上安装时需要 -all_load 标志。 -ObjC 是模拟器所需要的一切。

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多