2017-09-08 65 views
2

我在iOS中遇到以下錯誤,無法想出__NSCFData是什麼。我明白爲什麼這個錯誤正在發生,並且我們已經解決了這個問題,但我對在錯誤消息中出現的陌生類感到好奇。什麼是__NSCFData,它與NSData有什麼關係?

2017-08-07 21:41:37.458 [**App name redacted**][5316:2314238] 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[__NSCFData isEqualToString:]: unrecognized selector sent 
to instance 0x6080000b97b0' 

我通過Google文檔NSDataCFData,並且toll-free bridging

看我也看爲__NSCFData頭和它是NSImmutableData一個子類。還有一個NSCFData課,讓我困惑。

我有以下問題:

  1. 什麼是__NSCFData雙下劃線呢?
  2. NSCFData究竟是什麼?也許這是一個模棱兩可的類型,可能是指NSDataCFData對象?
+2

它是NSData類集羣的一部分。爲什麼你需要知道那是什麼?你的代碼崩潰是因爲你正在NSData的一個實例上調用一個NSString方法。 – Paulw11

+0

@ Paulw11是的,這更多是出於好奇。我知道墜機事件發生的原因。我期望在錯誤日誌中看到NSData或CFDataRef,而不是私有的__NSCFData類,並且想知道那是什麼。 – orangemako

回答

2

許多基礎類型和相應的CoreFoundation類型彼此「免費橋接」,這意味着CoreFoundation結構的內部佈局與Objective-C對象的內部佈局相同,結果是該toll無需橋接的NS和CF類型可以簡單地互相轉換,而無需經過任何轉換過程。 NSDataCFDataRef是以這種方式橋接的類型的示例;你可以從普通C中取出一個CFDataRef,將它轉換爲NSData *,並將它用作Objective-C對象,它將起作用。

當然,還有很多hackery在引擎蓋下啓用所有這些魔法,包括許多私人類型,如__NSCFData。這些通常是您不需要擔心的實施細節;與此相關的部分是您的對象屬於NSData的子類,因此您可以使用NSData的方法(而不是NSString的;您發佈的錯誤消息表明您的代碼中的某些內容正試圖發送NSString-isEqualToString:方法到NSData對象,這是無效的)。

無論如何,找出代碼試圖將錯誤信息發送到NSData對象,設置在調試異常斷點,並應儘快程序命中誤差把它權利了。

相關問題