問題:
1.控制臺要po某個變量(尤其是字典的鍵值)時出現(xiàn) <extracting data from value failed>
2.KVO監(jiān)聽BOOL類型的時候出現(xiàn)BUG
原因:
總體來說就是因為KVO的change字典存的不是官方公開的類型蔗包,而是一些私有的(前面帶下劃線的)類型催植,用的時候要處理一下,比如BOOL就要注意一點(例子2)
-
情況1:
該變量不能在控制臺打印輸出,但是程序跑起來沒毛病
比如我這個例子中,要在控制臺 po 的東西其實是個NSURL,正常情況下是可以在控制臺po出來的。
但如果 這個NSURL是存在字典中(比如KVO的change字典)這時候在控制臺po就會出現(xiàn)取不到value -- <extracting data from value failed>
比如,在使用KVO監(jiān)聽webView的URL屬性時茎活,URL發(fā)生變化了
此時通過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!!
這個出現(xiàn)在我監(jiān)聽BOOL類型的時候,當時的情況大概就是不管我的BOOL是什么普办,KVO的change字典中得到玩意賦出來都是YES
原因是:
KVO中change字典里面存的不是BOOL
而是__NSCFBoolean
這玩意除了不能在控制臺打印出來工扎,還有個麻煩--它是個結構體,結果就是不管監(jiān)聽的BOOL變量A是YES還是NO衔蹲,到這里都是一個枚舉類型肢娘。(kCFBooleanFalse
和kCFBooleanTrue
)
如果直接把這個枚舉類型拿去賦值給一個新的BOOL變量B,肯定一直都是有值不是nil或者null,所以這個新的BOOL變量B就會一直是YES橱健。 -
解決辦法:
step1:用CFBooleanRef temp = (__bridge CFBooleanRef)([change allValues][1]);
接收
step2:三目賦值self.functionView.leftBtn.enabled = (temp == kCFBooleanFalse)?NO:YES;