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问题解决,布布扣,bubuko.com

时间: 2024-10-26 22:52:15

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

__NSCFString containsString:]: unrecognized selector sent to instance 0x7f876b79e160

If you want your code to work on iOS 7 as well as iOS 8 you should use one of the rangeOfString calls instead. Basically if the range returned has a length of zero, the substring is not there. /* These methods return length==0 if the target string is

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

还真是一波未平一波又起,又出现了这个问题,详情如下: -[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x17deba00 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString countByEnumer

出现“unrecognized selector sent to instance”问题原因之一及解决方法。

? 对于iPhone开发初学者来说,很想实现自己在iPhone上的第一个小程序,准备工作就绪侯就信心满满的开始了!一般来说大家可能都是从Hello World做起吧. 反正我是的,:),如果按照文档上的说明去做,一般也不会出现什么问题.也建议初学者这样开始,毕竟会增强我们自己的信心. 但是当我们自己独立去做一个Button实现响应事件的小程序的时候,有时候确给我们出现了一点点小问题.也就是我题目所说的.下边我就列出出现此问题的 错误代码以及解决方式. code: [cpp] view plain

UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法

开发中常见的一类崩溃错误是遇到:unrecognized selector sent to instance 0xaxxxx…而backtrace又无法明确说明错误在哪行代码,如何快速定位BUG呢? 有时读代码一下很难找到是哪个instance出的问题,这时定制有效的DEBUG断点是最好的办法,方法如下: 在Debug菜单中选择 Breakpoints -> Create Symbolic Breakpoint… 在Symbol中填写如下方法签名: 1 -[NSObject(NSObject)

(未解决)[NSNull intValue]: unrecognized selector sent to instance 0x375c9860

今天遇到这个问题,程序崩溃了……日志如下: -[NSNull intValue]: unrecognized selector sent to instance 0x375c9860*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull intValue]: unrecognized selector sent to instance 0x375c9860' ***

[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错

今天接口由get换成post,我去改进行登录但出现了这个错误,首先出错先看能不能与服务器交互,能不能获得数据,其次,获得的数据是不是你想要的,记住,首先出错要想到是自己的问题,还有就是程序崩了要学会自己解决,打断点找原因,一步步跟,看是哪里出了问题 我这个问题一看就是拿了NSCFNumber类型和NSString类型做了比较,由于不会响应isEqualToString方法而报错,所以只要转换一下就可以了 NSString *factory_id = [NSString stringWithFor

利用objc的runtime来定位次线程中unrecognized selector sent to instance的问题

昨天遇到一个只有一行错误信息的问题: -[NSNull objectForKey:]: unrecognized selector sent to instance 0x537e068 由于这个问题发生在次线程,所以没有太有用的堆栈信息,而是只有简单的SIGABRT信息: 考虑到unrecognized selector sent to instance这类问题是由于向某个对象发送了未实现的消息,这个过程大致如下(图片摘自这里): 参考Objective-C的对象模型: struct objc_

unrecognized selector sent to instance

[iOS] Error Fixed : [__NSArrayI addObject:]: unrecognized selector sent to instance 当我创建了一个NSMutableArray 对象的时候 @property (nonatomic,copy)NSMutableArray *children; 然后通过addObject运行就会报错,[__NSArrayI addObject:]: unrecognized selector sent to instance 解决

iOS开发笔记--[__NSArrayI addObjectsFromArray:]: unrecognized selector错误

操作NSMutableArray数字增加和删除时候出现崩溃,报错[__NSArrayI addObjectsFromArray:]: unrecognized selector. 找了一个小时,发“__NSArrayI”这个提示比较重要.查了一下发现 __NSArrayI is a code-word for an immutable array - that is, a "regular" NSArray which you cannot change. __NSArrayM is