NSURLComponents
蘋果在 iOS 7 和 OS X Mavericks 中悄悄添加了 NSURLComponents
,這樣就可以完美替代 NSMutableURL
了。但文檔還不是很完善,所以這個類仍然是近期Foundation新增類中隱晦的一塊。
創建 NSURLComponents
實例和創建 NSURL
實例的方法差不多,通過一個 NSString
和一個非必需的base URL參數創建(+componentsWithString:
& +componentsWithURL:resolvingAgainstBaseURL:
)。也可以用 alloc init
創建一個空的容器,和 NSDateComponents
差不多。
NSURL
和 NSURLComponents
的不同之處在于,URL component 屬性是 readwrite
的。它提供了安全直接的方法來修改URL的各個部分:
scheme
user
password
host
port
path
query
fragment
如果嘗試賦值一個非法的scheme或port,會拋出一個異常。
另外,NSURLComponents 也有 readwrite 屬性對每個 component 進行 [percent-encoded]。
percentEncodedUser
percentEncodedPassword
percentEncodedHost
percentEncodedPath
percentEncodedQuery
percentEncodedFragment
對這些 percent encoding 屬性的 get 操作可能會造成 retain 增加。set 操作會默認認為該 component 已經正確 encode 了。試圖賦值一個非法的 percent encode 值會拋出異常。雖然 ‘;’ 是一個合法的路徑字符,但建議還是percent-encoded一下來兼容NSURL(傳遞給-stringByAddingPercentEncodingWithAllowedCharacters: URLPathAllowedCharacterSet參數 會將所有的 ‘;’ 字符 percent-encode)。
Percent-Encoding
說起 percent-encoding…
NSURL
對 CFURLRef
的轉換是 無縫的。底層的 C API 有 NSURL
的所有功能。包括 CFURLCreateStringByAddingPercentEscapes
和 CFURLCreateStringByReplacingPercentEscapesUsingEncoding
異常:
* `CFURLCreateStringByAddingPercentEscapes`:創建一個字符串的復制,用同義的 percent-encoded 字符代替原有的字符。
CFStringRef CFURLCreateStringByAddingPercentEscapes (
CFAllocatorRef allocator,
CFStringRef originalString,
CFStringRef charactersToLeaveUnescaped,
CFStringRef legalURLCharactersToBeEscaped,
CFStringEncoding encoding
);
CFURLCreateStringByReplacingPercentEscapesUsingEncoding: 創建一個新字符串,用同義的percent-encoded字符代替原有的所有可替換字符。
CFStringRef CFURLCreateStringByReplacingPercentEscapesUsingEncoding (
CFAllocatorRef allocator,
CFStringRef origString,
CFStringRef charsToLeaveEscaped,
CFStringEncoding encoding
);
Bookmark URL
最后一個話題是關于 bookmark URL 的,bookmard URL 可以在應用多次啟動間安全地引用文件。可以認為是一種對 文件描述符 的持久化。
一個bookmark是一個唯一的數據類型,包含一個描述文件位置的 NSData 對象。鑒于path和文件引用URL在多次啟動間可能被破壞,bookmark就可以被用來重建某個文件的URL地址,即使文件被改名或移動了位置也可以。
你可以在蘋果官方的文件系統編程指南的”Locating Files Using Bookmarks”部分中閱讀更多關于 bookmark URL 的內容。
忘記噴射火箭背包,忘記會飛的汽車吧,看看我對未來的設想:所有的東西都有一個 URL,以 Markdown 編碼,用 Git 存儲!如果你對宇宙資源定位器有興趣的話,你會同意我的想法的!
像超文本一樣,通用標識就是一個哲學概念,通用標識理念早于計算機時代被提出,也將長存于人類信息體系中。這些通用標示合在一起便可以代表我們信息時代的架構:一個用來把我們對于宇宙每一點了解都encode為一個網絡中實體的框架,這很酷,很像我們的大腦中存在很多神經元一樣。
我們處在物理計算的寒武紀大爆發險境邊緣。用不了多久就會出現這樣的情景:在Internet組成的世界中,我們生活中的每一部分都有一個URL,也都有一個電子化的大腦,都有數字化的精神和意識。雖然不能說是奇點迫近,但是,我們,就正在某些未知但難以置信的奇妙事物邊緣,馬上就要感受到它的來臨。
世界總是這樣的:互相交換貓咪照片的技術,總是蘊含著無比高深的哲學含義。