最近的工作需要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
。
后来想一想,唯一的解释是。静态库文件在打包时,里面的宏的值就固定了下来。也就是上面的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.有时候别人给出来的答案不一定是对的,一定要从自己所处的环境出发思考问题。
版权声明:本文博客原创文章。博客,未经同意,不得转载。