2012年08月03日

NSURLをNSStringから作る時に失敗した

NSURLは随分前からあるし何をするものかわかりきっているのだけど、うっかりミスで長時間原因究明に時間がかかってしまったので念のためメモを残しておくことにする。

アップルは最近ローカルディスク上のファイルアクセスにもNSStringを使ったパスではなくNSURLを使う使うことを推奨しており、過去に...WithPath:などのパスでファイルを指定するAPIを...WIthURL:のようにNSURLを使うAPIに変更し古いAPIはdeprecatedにしつつある。

しかも今回OSをMountain Lionにアップグレードした直後だったので自分の使い方ではなくてOSのバグを疑ってしまったので解決までに時間がかかってしまった。

問題はパス文字列からNSURLを作るとき、あるいはNSURLからパス文字列に変換するときに使うメソッドの選択である。

例えば、 /Users/name/Documents/Readme.txt というファイルパスに対するパス文字列は以下で作成できる。


NSString *aPath = @"/Users/name/Documents/Readme.txt";


そして、これの中身をバイナリデータとして取り込むには以下で可能だ。

NSData *aData = [NSData dataWithContentsOfFile:aPath];


同じNSDataを取り出すのにURLを使うこともできて以下のようになる。

NSData *aData = [NSData dataWithContentsOfURL:aURL];


ここでaURLをどうやって作るかを間違えた。

NSURL *aURL = [NSURL URLFromString:aString];


これでもエラーにはならないので平気だと思って使ってしまった。実際に使ったのはNSPathControlだが、実際なんの問題も起らないでほとんど使える。上記で作ったURLをセットしてもフォルダアイコンがカスタムのものにならない程度でほぼ使えている。ところがその子要素であるNSPathComponentCellからURLを取り出そうとするとこれがセットされていなかったというわけだ。

使うべきAPIはこちら。

NSURL *aURL = [NSURL fileURLWithPath:aString];


逆にNSURLからパス文字列を取り出すには

NSString *thePath = [aURL path];


でよい。これは上記で失敗したからpathという単純なのではだめだからきっとabsolutePathの方だと思ってしまいやっぱり失敗した。
posted by 永遠製作所 at 00:19| 東京 ☀| Comment(0) | TrackBack(0) | Cocoa | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック