IOS 静态库使用分类导致无法找到问题

  1. 通过在Other Linker Flags添加-all_load,它会告诉编译器“对于所有文档中的所有对象文件,不管里面的符号有没有被用到,都载入”,这种方法确实可以,但是会产生比较大的二进制文件。

  2. 另一种方法是添加-force_load和指定的路径,这种方法和-all_load很像,不同的是它只使用指定的归档。

  3. 最受欢迎的方法是在 Other Linker Flags 中添加"-ObjC",这个标识告诉编译器“如果你在文档里的对象文件中发现了OC代码,就把它载入“,Category里当然也有OC代码。使用这种方法不会载入任何没有OC代码的文件

  4. 另一种解决方法是新Xcode里build setting中的"Perform Single-Object Prelink",如果启用这个选项,所有的对象文件都会被合并成一个单文件(这不是真正的链接,所以叫做预链接),这个对象文件(有时被称做主对象文件(masterobject file))被添加到文档中。现在如果主对象文件中的任何符号被认为是“在使用”,整个主对象文件都会被认为在使用,这样它里面的OC部分就会被载入了。因为里面的类都被正常符号化了,所以能使从这样的静态库中使用所有的category。

  5. 最后一种解决方法是在只有category的源文件里添加Fake symbol。如果你想在runtime里使用category,一定要确保你以某种方法在编译时引用了fake symbol,这会使得对象文件以及它里面的OC代码被载入。例如,它可以是一个有空函数体的函数,也可以是一个被访问的全局变量(例如一个全局的int变量,只要它被读或者写了一次就足够了)。和上面其他的解决方法不一样,这种解决方法可以控制哪些category可以在runtime里被编译后的代码使用(可以通过使用这个符号,使它们被链接并变得可用;也可以不使用这个符号,这样链接器就会忽略它)
    .h
    void import_XXX_Compression
    .m
    void import_XXX_Compression ( ) { }

然后找一个地方调用上面的方法:
attribute((used)) static void importCategories ()
{
import_XXX_Compression();
}
实际编码中采用了第5种,亲测可用

你可能感兴趣的:(IOS 静态库使用分类导致无法找到问题)