了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发
IOS学习交流群 431449751;
导入Growing-IOS-SDK后,运行时报错:
[AppDelegate addFoObserverSelector:template:type:callbackBlock:]: unrecognized selector sent to instance 0x170043de0
从错误提示上,明显看出是Growing-IOS-SDK包中的分类(category)没有引入进来,在excute时报错,随即在工程配置((Build Settings -> Other Linker Flags)中配置-ObjC, 但是配置后和其他的第三方出现了冲突,app中添加的第三方框架/库 有些是不需要-ObjC这个配置,如是就找了之前在项目中处理这个冲突的解决办法,并总结下Objc相关知识。
上次解决办法的使用方式如图:
我们先了解下静态库和编译相关知识,再看objc的使用:
在编译Objective-C源文件到目标文件时,编译器并不知道方法的对应实现,只能在运行时才知道,所以编译器只会为类生成链接符号,对类中的方法不会生成链接符号。由于Category方法并不对应一个新类,所以不会生成链接符号,链接器也不会将Category方法合并到原始的类中,最终导致链接器忽略了Category方法,不会将其链接到可执行文件中, 且静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,所以需要把libGrowing.a库中相应代码链接到APP中。但静态库链接是,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝如图:
查了相关资料: "-ObjC"的作用是:将静态库中任何Objective-C代码都链接到APP中。任何Objective-C代码当然也包括Category的方法。可以看出,使用-ObjC可能会链接很多静态库中未被使用的Objective-C代码,极大的增加APP的代码体积。
-force_load 是链接指定静态库中所有的代码到APP中;
-ObjC 链接静态库中所有的Objective-c代码到APP
-all_load 链接静态库中所有的代码到APP中
多说一点:
动态库链接时不复制,在运行时由系统加载到内存中,系统只加载一次,多个程序共用,节省内存。
自制的动态库是不能上传到appstore上的。
了解更多IOS底层原理知识请关注腾讯课堂八点钟学院IOS高级开发
https://ke.qq.com/course/171725