MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决

本文主要是介绍MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近的工作需要将工程打包成静态库文件,然后提供给别人使用。在工程中有引用第三方类库MBProgressHUD,在打包出静态库文件后,写了个Demo,引用了其中的一段代码来显示MBProgressHUD,在iOS 7模拟器中无错运行。

来到真机测试,在iOS 7的设备上无压力通过。但是在iOS 6的设备上显示MBProgressHUD时却崩溃了,错误提示为:

-[__NSCFString sizeWithAttributes:]: unrecognized selector sent to XXXXXX

由于我的机子上没有iOS 6的模拟器,所以只能借别人的iPhone 4/4S来测试,系统是iOS 6,结果就出现了以上问题。

因此,在这里奉劝大家一定要真机测试(模拟器往往是信不过的),而且一定要多种设备多个版本测试,因为有一些开源类库是不支持低版本的,或者你自己在使用过程中没有注意到版本上的禁忌等。


但是很奇怪的是,我在打包前创建静态库文件的工程中的测试是没问题的。

出现了这样的问题,第一时间谷歌了,结果看到CocoaChina中也有人遇到过这类问题,还问是不是MBProgressHUD自己的Bug,抱着怀疑的态度,我还是从自己的工程出发来思考。

我直接在工程中搜sizeWithAttributes,结果在MBProgressHUD.h中看到了:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000#define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithAttributes:@{NSFontAttributeName:font}] : CGSizeZero;
#else#define MB_TEXTSIZE(text, font) [text length] > 0 ? [text sizeWithFont:font] : CGSizeZero;
#endif

现在问题突然明朗了,因为在iOS 6的设备上调用了iOS 7的API,所以导致了崩溃,也就是上面的“unrecognized selector sent to XXXXXX”。但是,我在Demo中Log出来的__IPHONE_OS_VERSION_MIN_REQUIRED的确是60000,也就是iOS 6,疑惑了。。。

后来想一想,唯一的解释是,静态库文件在打包时,里面的宏的值就固定了下来,也就是上面的MB_TEXTSIZE对应的就是sizeWithAttributes的方法,即iOS 7的API,所以即使Demo工程中的__IPHONE_OS_VERSION_MIN_REQUIRED = 60000也改变不了什么了。

之后问了下老大,果然静态库在编译时里面的宏的值都固定下来了,因此Demo工程中调用的是iOS 7的API,在iOS 6的真机上跑当然崩溃了。瞬间豁然开朗。。。


解决办法:

设置生成静态库工程中的Deployment Target为iOS 6,注意,设置的Target不是工程本身,而是Library自己(有一个小房子的图标):

注意编译出来的API是iOS 6的API,因此iOS 6/7的设备都可以正常跑了,也就解决了上面的问题。



总结:

1.一定要真机测试,而且要多种设备(iPhone 4/4S/5/5S)多种系统版本(iOS 6/7)测试。

2.有时候别人给出来的答案不一定是对的,一定要从自己所处的环境出发思考问题。



这篇关于MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004229

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

在Ubuntu上打不开GitHub的完整解决方法

《在Ubuntu上打不开GitHub的完整解决方法》当你满心欢喜打开Ubuntu准备推送代码时,突然发现终端里的gitpush卡成狗,浏览器里的GitHub页面直接变成Whoathere!警告页面... 目录一、那些年我们遇到的"红色惊叹号"二、三大症状快速诊断症状1:浏览器直接无法访问症状2:终端操作异常

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT