iOS项目关于Other Linker Flags添加-Obj-C等

项目开发中,都会使用一些第三方的静态库,在导入这些第三方类库的时候,其开发文档都会有注明在Build Settings----->Linking------>Other Liker Fliags中添加-ObjC或-all_load或-force_load等。如果不这样做,运行就会报错从而导致闪退,报错是因为selector not recognized。

在苹果官方文档有说明

The "selector not recognized" runtime exception occurs due to an issue between the implementation of standard UNIX static libraries, the linker and the dynamic nature of Objective-C. Objective-C does not define linker symbols for each function (or method, in Objective-C) - instead, linker symbols are only generated for each class. If you extend a pre-existing class with categories, the linker does not know to associate the object code of the core class implementation and the category implementation. This prevents objects created in the resulting application from responding to a selector that is defined in the category.

翻译过来大概是:“选择器不能识别”由于发生运行时异常之间的问题的实现标准的UNIX静态库链接器和objective - c的动态特性。objective - c并不为每个函数定义链接器符号(或方法,在objective - c)——相反,链接器符号只是为每个类生成。如果你扩展已有类类别,链接器不知道把核心类的对象代码实现和类别的实现。这可以防止在最终的应用程序中创建的对象对一个选择器中定义的类别。

这个时候就体现出-ObjC或-all_load或-force_load的重要性。

-ObjC

苹果官方有这样一段话

This flag causes the linker to load every object file in the library that defines an Objective-C class or category. While this option will typically result in a larger executable (due to additional object code loaded into the application), it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes.

翻译:这个标志让链接器加载库中的每个对象文件,它定义了一个objective - c类或类别。而这个选项通常会导致一个更大的可执行文件(由于额外的对象代码加载到应用程序),它将使有效objective - c的成功创建静态库,包含类别在现有类。

但有时仅仅这一个参数并不能解决问题,所以就需要添加-all_load-force_load

官方给出的如下解释

Important: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -allload or -forceload flags.

重要:对于64位和iPhone OS应用程序,有一个链接器错误,防止objc加载对象从静态库文件只包含类别和没有类。解决方法是使用-allload或-forceload旗帜。

-all_load

使用-all_load会强制把目标文件都加载进来,但项目不是使用了一个静态库,这个时候也会出现错误,解决方法一般都是再添加-force_load,需要注意的是-force_load必须指定具体的文件路径,也就是说只完全加载了一个库文件,不影响其余库文件的加载。


你可能感兴趣的:(杂类,ios,Xcode,Other,Linker,Flags,-ObjC)