[英]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_ACCESS
上NSLog()
的是試圖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
通過scrubbed
到NSLog
作為參數NSLog("Scrubbed: %@", scrubbed)
任何這些“解決方法”都可以解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.