`NSURL`を文字列から作ってどう処理されているのか調べてみた

URLを扱うためのクラス…というのはわかるけど何がなんだかイマイチよくわかっていなかったので少し調べた

とりあえず適当に動かしてNSURLのメソッドの中から文字列を返すものをログに吐き出してみた

NSURL *url = [NSURL URLWithString:@"ここに色々な文字列をいれてみました"];
NSLog(@"%@ ... ", [url なんらかのメソッド], ... );

@"http://userName:userPassward@fernweh.jp:80/b/sitemap/?param&b=11#F" の結果

absoluteString : http://userName:userPassward@fernweh.jp:80/b/sitemap/?param&b=11#F
fragment : F
path : /b/sitemap
parameterString : (null)
query : param&b=11
lastPathComponent : sitemap
host : fernweh.jp
scheme : http
user : userName
password : userPassward
resourceSpecifier : //userName:userPassward@fernweh.jp:80/b/sitemap/?param&b=11#F
relativePath : /b/sitemap
relativeString : http://userName:userPassward@fernweh.jp:80/b/sitemap/?param&b=11#F
pathExtension : 
description : http://userName:userPassward@fernweh.jp:80/b/sitemap/?param&b=11#F

なるほど、静的イニシャライザで与えた文字列をパースしてくれるんだね。

でも query はパースしてくれない。ぐぐってみるとどうやら query のパースは自分でやらないとダメっぽい。

@"hoge" の結果

absoluteString : hoge
fragment : (null)
path : hoge
parameterString : (null)
query : (null)
lastPathComponent : hoge
host : (null)
scheme : (null)
user : (null)
password : (null)
resourceSpecifier : hoge
relativePath : hoge
relativeString : hoge
pathExtension : 
description : hoge

@"あいうえお" の結果

マルチバイト文字列には見事な拒否反応をしてくれました。返された NSURL*nil だった… NSURL に与える文字列はあらかじめURLエンコードされていなければダメなようです。

@"foo/bar?2000" の結果

absoluteString : foo/bar?2000
fragment : (null)
path : foo/bar
parameterString : (null)
query : 2000
lastPathComponent : bar
host : (null)
scheme : (null)
user : (null)
password : (null)
resourceSpecifier : foo/bar?2000
relativePath : foo/bar
relativeString : foo/bar?2000
pathExtension : 
description : foo/bar?2000

parameterStringpathExtension が全部空っぽだったおかげでどんなメソッドなのかわからない orz。

ログに出力しなかったけど、 port メソッドはポート番号の NSNumber* を返す。。

同じくログに出力しなかったけど、pathComponent メソッドは path を分解した NSArray* を返す。

Share