iOS - KVO - <extracting data from value failed> - __NSCFBoolean

问题:
1.控制台要po某个变量(尤其是字典的键值)时出现 <extracting data from value failed>
2.KVO监听BOOL类型的时候出现BUG
原因:
总体来说就是因为KVO的change字典存的不是官方公开的类型,而是一些私有的(前面带下划线的)类型,用的时候要处理一下,比如BOOL就要注意一点(例子2)

  • 情况1:
    该变量不能在控制台打印输出,但是程序跑起来没毛病
    比如我这个例子中,要在控制台 po 的东西其实是个NSURL,正常情况下是可以在控制台po出来的。

但如果 这个NSURL是存在字典中(比如KVO的change字典)这时候在控制台po就会出现取不到value -- <extracting data from value failed>

比如,在使用KVO监听webView的URL属性时,URL发生变化了
此时通过KVO回调方法observeValueForKeyPath:...里面的change去取这个新的值--change[NSKeyValueChangeNewKey]
此时打断点,在控制台打印就是

<extracting data from value failed>

但结果还是能正常使用这个NSURL的,只是控制台不能po出来

//下面这个是给我自己做个记录,免得以后再犯这个错

在我的程序中如果直接让它跑过去会报错:
-[NSURL rangeOfCharacterFromSet:]: unrecognized selector sent to instance 0x6000002e0b80
显然是因为我没有意识到KVO的change中取出来的是一个NSURL,我还傻乎乎地把它放给textField去用
解决方法就是用NSURL *urlTemp=change[NSKeyValueChangeNewKey]去接到这个值然后用XXtextField.text = urlTemp.absoluteString来赋值。

  • 情况2:
    不仅不能在控制台打印输出,程序也有 !!BUG!!
    这个出现在我监听BOOL类型的时候,当时的情况大概就是不管我的BOOL是什么,KVO的change字典中得到玩意赋出来都是YES
    原因是:
    KVO中change字典里面存的不是BOOL而是__NSCFBoolean
    这玩意除了不能在控制台打印出来,还有个麻烦--它是个结构体,结果就是不管监听的BOOL变量A是YES还是NO,到这里都是一个枚举类型。(kCFBooleanFalsekCFBooleanTrue)
    如果直接把这个枚举类型拿去赋值给一个新的BOOL变量B,肯定一直都是有值不是nil或者null,所以这个新的BOOL变量B就会一直是YES。
  • 解决办法:
    step1:用CFBooleanRef temp = (__bridge CFBooleanRef)([change allValues][1]);接收
    step2:三目赋值self.functionView.leftBtn.enabled = (temp == kCFBooleanFalse)?NO:YES;

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 25,390评论 30 469
  • 原文链接http://www.cnblogs.com/kenshincui/p/4186022.html 音频在i...
    Hyman0819阅读 19,585评论 3 71
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 1,960评论 0 35
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,497评论 0 7
  • 苦苦坚持的并不一定是对的,但是没有目标的存在是有罪恶感的!
    云妮yunni阅读 127评论 0 0
  • 一 你好,前男友 “你好,我是你的前女友,你还记得我吗?” 这是在继我们分开半年之后我第一次给你发了消息,这是在5...
    支离er阅读 387评论 0 0
  • 眼袋对人们的精神面貌有一定的影响,所以,许多人选择了手术去除眼袋。那么,手术去眼袋效果好吗?下面跟着学习啦小编一起...
    广州曙光整形医生阅读 542评论 0 0
  • 9月2日 早上7:42--8:07 在表示世界上独一无二的东西的名词前要加 the : What is the l...
    立仁阅读 103评论 0 1
  • 2017.03.29 五月天20周年
    Ycai19阅读 137评论 0 0