【发布时间】:2009-08-13 00:24:46
【问题描述】:
我在 iPhone 上使用 Three20,我试图通过使用类类别来更改方法在其中的作用。它编译得很好,但我从来没有达到它的断点。
我假设一个类类别会影响该类的所有实例,因此我不必重新编译静态库即可使其工作。
我也知道我用于该类别的类正在被看到,因为如果我在接口和实现该类别时在类名的末尾添加一个“x”,编译器将失败。
非常感谢这里的任何指导。
【问题讨论】:
标签: iphone objective-c categories
我在 iPhone 上使用 Three20,我试图通过使用类类别来更改方法在其中的作用。它编译得很好,但我从来没有达到它的断点。
我假设一个类类别会影响该类的所有实例,因此我不必重新编译静态库即可使其工作。
我也知道我用于该类别的类正在被看到,因为如果我在接口和实现该类别时在类名的末尾添加一个“x”,编译器将失败。
非常感谢这里的任何指导。
【问题讨论】:
标签: iphone objective-c categories
正如here 所指出的,您需要在应用程序的其他链接器标志中设置-all_load 选项,以便将类别与iPhone OS 3.0 中的静态库链接。 -ObjC 也可以解决问题,但它不适用于当前的 SDK。 从 Xcode 4.2 中的 LLVM 编译器开始,他们修复了阻止 -ObjC 的其他链接器标志正常工作的链接器错误,所以您不再需要使用 -all_load (它有一些讨厌的副作用)。 -ObjC 应该是您从静态库中提取类别所需的全部内容。
这可能会导致您的问题,尽管我认为 Three20 首先需要设置这些链接器标志才能与您的应用程序正确链接,因此您可能已经有了这些标志。
【讨论】:
当两个类别覆盖同一个二进制文件中同一个类的同一个方法时,没有定义哪个覆盖优先。为了获得最佳结果,请创建一个子类,然后覆盖其上的方法。或者,由于 Three20 是 Apache 许可的,您可以在库本身中进行更改。
【讨论】:
我有一个链接到静态库的项目,是的,在使用 3.0 sdk 的设备上安装时需要 -all_load 标志。 -ObjC 是模拟器所需要的一切。
【讨论】: