最近的工作需要project打包成一个静态库文件,然后给他人使用提供。

在project有提及第三方库MBProgressHUD。在打包出静态库文件后,写了个Demo,引用了当中的一段代码来显示MBProgressHUD。在iOS 7模拟器中无错执行。

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

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

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

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

可是非常奇怪的是。我在打包前创建静态库文件的project中的測试是没问题的。

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

我直接在project中搜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。所以即使Demoproject中的__IPHONE_OS_VERSION_MIN_REQUIRED = 60000也改变不了什么了。

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

解决的方法:

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

注意编译出来的API是iOS 6的API。因此iOS 6/7的设备都能够正常跑了,也就攻克了上面的问题。

总结:

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

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

版权声明:本文博客原创文章。博客,未经同意,不得转载。

MBProgressHUD -[__NSCFString sizeWithAttributes:]: unrecognized selector问题解决了的更多相关文章

  1. '-[__NSCFString stringFromMD5]: unrecognized selector sent to instance 0x14d89a50'

    类型:ios 问题描述: 导入百度地图 然后在模拟器运行可以,真机测试不行: 报错: '-[__NSCFString stringFromMD5]: unrecognized selector sen ...

  2. -[__NSCFString longValue]: unrecognized selector sent to instance

    You can use NSString methods intValue longLongValue. 这个使用longvalue会crash报上面的错误

  3. [__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x17deba00

    还真是一波未平一波又起,又出现了这个问题,详情如下: -[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized ...

  4. ios unrecognized selector sent to instance出现的原因和解决方案

    概述:造成unrecognized selector sent to instance iphone,大部分情况下是因为对象被提前release了,在你心里不希望他release的情况下,指针还在,对 ...

  5. unrecognized selector sent to instance

    今天长一见识(特此感谢小星星老湿-坏笑),凡是遇到“unrecognized selector sent to instance *******”的都是******方法没有,比如这种的错误: 可以尝试 ...

  6. IOS 错误 [UIWebView cut:]: unrecognized selector sent to instance

    那在什么场景中会出现这种情况呢? 如果一个包含文字的输入元素有焦点,然后按钮的点击会导致输入失去焦点,然后接下来在输入时双按会重新得到焦点并从弹出bar中选择剪切复制粘贴,就会导致此error. 也就 ...

  7. iOS 程序报错:reason: [NSArrayI addObject:]: unrecognized selector sent to instance

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI ad ...

  8. -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000e3

    网络数据解析出现-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000e3这样的错误,具体 re ...

  9. CBUUID UUIDString unrecognized selector sent to instance 错误

    CBUUID UUIDString unrecognized selector sent to instance 错误 ios7.0,4s 蓝牙出现上述错误! 查看api可知,错误原因,由于CBUUI ...

随机推荐

  1. Thanks

    今天,突然有一种爽的感觉.是做题做到爽的感觉,晚上就不是非常强烈了,脖子疼,要断了. 中午.妈妈给我打了电话,后来才知道爸爸的嗓子都哑了.说不出话来了都,哎,这都快一个月没有下雨了.地都干得要命了.好 ...

  2. 从电商秒杀与抢购谈Web系统大规模并发

    从电商秒杀与抢购谈Web系统大规模并发 http://www.iamlintao.com/4242.html 一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程 ...

  3. ExtJS4 表格的嵌套 rowExpander

    今天做一个grid,里面的数据须要带明细,思来想去还是搞个表格嵌套吧!看下图 对于grid中每一条记录点击左边的+号能展开一个明细的子表格 全部数据包含列名均从后台获得,子表格的数据临时在本地以做測试 ...

  4. 定制Attribute

    目录 Attribute是什么 自定义Attribute 一.Attribute是什么 将一些附加信息与制定目标相关联的方式.编译器在元数据中生成这些额外的信息.也叫做特性. 比如之前文章中提到的:枚 ...

  5. String.Format in Java and C#

    原文:String.Format in Java and C# JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String ...

  6. Balanced Binary Tree(Java代码没有结束,是什么原因???)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  7. document.all使用

    document.all 一个. document.all它是在页面中的所有元素的集合.例如:      document.all(0)一个元素 二. document.all能够推断浏览器是否是IE ...

  8. hexo 部署至Git遇到的坑

    查找资料的时候发现了next这个博客主题,next!非常的漂亮,顺手查看了hexo的相关部署. Hexo官方介绍 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲 ...

  9. 好记性不如烂笔头85-spring3学习(6)-BeanFactory 于bean生命周期

    假设BeanFactory为了产生.管理Bean, 一个Bean从成立到毁灭.它会经过几个阶段运行. 据我所知,一般bean包括在生命周期:设定,初始化,使用阶段,四个核心阶段销毁. 1.@Bean的 ...

  10. IOS View传统的价值观之间

    1.采用NSUserDefaults通过值,这样的方法不限于传送少量数据的: 比方你要传一个float的值.在须要传的时候用 [[NSUserDefaults standardUserDefaults ...