5

呼び出すとき+[NSURL URLWithString:]、URL を作成するための 2 つのオプションがあります。

[[@"http://example.com" stringByAppendingPathComponent:@"foo"] stringByAppendingPathComponent:@"bar"]

また

[@"http://example.com" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"];

-[NSString stringByAppendingPathComponent:]-[NSString stringByAppendingFormat:]より正しい答えのように思えますが、次の場合のようにダブルスラッシュを処理する以外に何かを失うことはありますか?

// http://example.com/foo/bar
[[@"http://example.com/" stringByAppendingPathComponent:@"/foo"] stringByAppendingPathComponent:@"bar"] 

// http://example.com//foo/bar  oops!
[@"http://example.com/" stringByAppendingFormat:@"/%@/%@",@"foo",@"bar"];
4

4 に答える 4

3

stringByAppendingPathComponent で問題が発生しました。どこでも二重スラッシュが削除されます!:

NSString* string1 = [[self baseURL] stringByAppendingString:partial];
NSString* string2 =  [[self baseURL] stringByAppendingPathComponent:partial];

NSLog(@"string1 is %s", [string1 UTF8String]);
NSLog(@"string2 is %s", [string2 UTF8String]);

https://blah.comの baseURl の場合

/moreblah の一部

次の 2 つの文字列を生成します。

2012-09-07 14:02:09.724 myapp string1 はhttps://blah.com/moreblahです

2012-09-07 14:02:09.749 myapp string2 は https:/blah.com/moreblah です

しかし、何らかの理由で、リソースを取得するための blah.com への呼び出しは、単一のスラッシュで機能します。しかし、stringByAppendingPathComponent は URL ではなくパス用であることを示しています。

これは、iOS 5.1 を実行する iPhone 4 ハードウェア上にあります。

デバッガーの出力が信頼できるものであることを確認したかったので、UTF8 文字列を出力しました。

だから私は言っていると思います-URLにパスを使用しないでください。自家製またはライブラリを使用してください。

于 2012-09-07T18:07:07.207 に答える
1

どうですか:

[NSString pathWithComponents:@[@"http://example.com", @"foo", @"bar"]]

コメントで指摘されているように/、 のメソッドを使用すると a がプロトコルから削除されるNSPathUtitlites.hため、これは明らかな失敗です。私が投稿した元の解決策に最も近い解決策は次のとおりです。

[@[ @"http://example.com", @"foo", @"bar" ] componentsJoinedByString:@"/"]

パスセパレータにリテラルを使用するだけで済みNSStringます

NSString'/' をパス セパレータとし、'.' を使用して一般的にパスを表します。拡張セパレーターとして。

于 2012-09-06T21:12:32.867 に答える
0

stringByAppendingPathComponentのポイントは、ダブルスラッシュを処理することですが、次のようなことができます。

[[@"http://example.com/" stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/%@", @"foo", @"bar"]]
于 2012-09-06T21:05:25.673 に答える