簡體   English   中英

Swift URL字符串編碼崩潰在iOS上?

[英]Swift URL String encoding crashing on iOS?

我有一個URL字符串,其末尾附加了變量,如下所示:

.../create?title=My Apartment

我想逃避任何無效的字符(如空格),但是當我嘗試這樣做時,我使用以下方法在模擬器和我的設備(iOS 8.0)上崩潰:

NSLog("Item1: \(item)")
NSLog("Item2: \(item.title)")

if let scrubbed = item.title.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) {
    NSLog("Scrubbed: \(scrubbed)")
} else {
    NSLog("Nope!")
}

在模擬器上看到是:

2014-09-24 16:59:19.120 MyApp[16406:171349] Item1: MyApp.PostItem
2014-09-24 16:59:19.121 MyApp[16406:171349] Item2: My Apartment
2014-09-24 16:59:19.125 MyApp[16406:171349] Scrubbed: My              0X0P+0partment

注意那個擦洗字符串的奇怪之處。 一段時間后,它崩潰抱怨一個構造不良的NSURL對象,毫不奇怪。

當我在我的設備上運行此,我有崩潰EXC_BAD_ACCESSNSLog()的是試圖print語句Scrubbed:

2014-09-24 17:04:37.378 MyApp[4346:2048259] Item1: MyApp.PostItem
2014-09-24 17:04:37.379 MyApp[4346:2048259] Item2: My Apartment

(lldb) po scrubbed

error: <EXPR>:1:1: error: non-nominal type '$__lldb_context' cannot be extended
extension $__lldb_context {                            
^
<EXPR>:11:5: error: 'PostManager.Type' does not have a member named '$__lldb_wrapped_expr_3'
    $__lldb_injected_self.$__lldb_wrapped_expr_3(     
    ^                     ~~~~~~~~~~~~~~~~~~~~~~
(lldb) 

我怎么能弄清楚這里發生了什么? 我本以期待看到Nope! 在像這樣崩潰之前打印在控制台中。 模型對象中的String值由UITextField提供。

編輯:我能夠從預先擦除的值中獲取一些NSData輸出:

NSLog("Data: \(item.title.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false))")
...
2014-09-24 17:18:43.620 MyApp[4367:2051348] Data: Optional(<4d792041 70617274 6d656e74>)

編輯2:我可以在Xcode中確認此崩潰 ,並在操場上通過 似乎是一個錯誤 - 但在哪里? Xcode的? 編譯器? 運行?

編輯3:如果我嘗試使用NSLog()打印出變量值,則只會出現此錯誤。 如果我完全避免這樣做,只使用變量,每個人都很高興。

看起來像使用NSCharacterSet.URLHostAllowedCharacterSet()轉義生成奇怪的unicode字符串,在使用此字符串作為第一個參數的情況下強制在NSLog中崩潰。

有幾種方法可以避免這種情況,你肯定應該使用它們:

  • 至於你在URL查詢中使用它,你肯定應該使用不同的字符集 - NSCharacterSet.URLQueryAllowedCharacterSet()

  • 使用print/println

  • 通過scrubbedNSLog作為參數NSLog("Scrubbed: %@", scrubbed)

任何這些“解決方法”都可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM