-ObjC的作用 和 Growing嵌入导致的unrecognized selector错误

在导入Growing-IOS-SDK后,出现unrecognized selector错误。问题源于Category未被引入。通过配置-ObjC可以解决,但可能导致与其他第三方库冲突。文章探讨了静态库、动态库与-ObjC、-force_load、-all_load的关系,并介绍了如何处理冲突。同时强调了动态库在内存使用和AppStore上传的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解更多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

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值