34

アプリを iPhone で実行するとバグが発生しますが、シミュレータで実行するとバグが発生しません。ホーム ディレクトリ パスの長さを使用して、/Documents 内のファイルの相対パスを抽出していました。残念ながら、ホーム パスにプレフィックス "/private" が追加されているため、これは iPhone では常に正しく機能するとは限りません。ただし、プレフィックスの有無にかかわらず、同じファイルが正常に参照されます。次のコードは、この矛盾を示しています。「/private」の目的は何ですか?また、いつ iOS から提供されますか?

- (IBAction)testHomepath:(id)sender {
    NSFileManager *fmgr = [NSFileManager defaultManager];
    NSString  *homePath = [NSString stringWithFormat:@"%@/Documents",NSHomeDirectory()];
    NSString  *dirPath  = [homePath stringByAppendingPathComponent:@"TempDir"];
    NSURL     *dirURL   = [NSURL fileURLWithPath:dirPath];
    NSString  *filePath = [dirPath  stringByAppendingPathComponent:@"test.jpg"];
    [fmgr createDirectoryAtPath:dirPath withIntermediateDirectories:NO attributes:nil error:nil];
    [fmgr createFileAtPath:filePath contents:nil attributes:nil];
    NSArray *keys  = [[NSArray alloc] initWithObjects:NSURLNameKey,nil];
    NSArray *files = [fmgr contentsOfDirectoryAtURL:dirURL includingPropertiesForKeys:keys options:0 error:nil];
    NSURL *f1 = (files.count>0)? [files objectAtIndex:0] : 0;
    NSURL *f2 = (files.count>1)? [files objectAtIndex:1] : 0;
    bool   b0 = [fmgr fileExistsAtPath:filePath];
    bool   b1 = [fmgr fileExistsAtPath:f1.path];
    bool   b2 = [fmgr fileExistsAtPath:f2.path];

    NSLog(@"File exists=%d at path:%@",b0,filePath);
    NSLog(@"File exists=%d at path:%@",b1,f1.path);
    NSLog(@"File exists=%d at path:%@",b2,f2.path);
}

iPhoneで実行した場合のログには以下が書き込まれます。行 1 と行 2 の違いを示すために、手動で出力の間隔を空けました。

2013-02-20 16:31:26.615 Test1[4059:907] File exists=1 at path:        /var/mobile/Applications/558B5D82-ACEB-457D-8A70-E6E00DB3A484/Documents/TempDir/test.jpg
2013-02-20 16:31:26.622 Test1[4059:907] File exists=1 at path:/private/var/mobile/Applications/558B5D82-ACEB-457D-8A70-E6E00DB3A484/Documents/TempDir/test.jpg
2013-02-20 16:31:26.628 Test1[4059:907] File exists=0 at path:(null)

シミュレーターで実行すると、ログに次のように書き込まれます (「/private」なし)。

2013-02-20 16:50:38.730 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/test.jpg
2013-02-20 16:50:38.732 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/.DS_Store
2013-02-20 16:50:38.733 Test1[7224:c07] File exists=1 at path:/Users/kenm/Library/Application Support/iPhone Simulator/6.1/Applications/C6FDE177-958C-4BF5-8770-A4D3FBD281F1/Documents/TempDir/test.jpg
4

6 に答える 6

4

実際にあなたの質問に答えるには:

彼らがOSXをリリースしたときに追加されたプレフィックスだったと思います( NeXTStep/privateにはなかったと思いますが、数十年になります)。、、、および(そして、奇妙なことにetc、PBG4でそれができるとは知りませんでした)を収容するために存在しているようです。vartmptftpbootetc

デバイス上で、Appleはユーザーデータをに保存することを決定しました/private/var/mobile(ユーザー名は「モバイル」です)。なぜ彼らが選択しなかったのか、/Users/mobileあるいは単に選択しなかったのかはわかりませんが、「通常の」Unix/mobileよりも重要性はありません。/var/mobile

シミュレーターでは、ユーザーアカウントは/var(正当な理由で)書き込むことができません。ユーザーデータはのどこかに保存され~/Library/Application Support/iPhone Simulatorます。ある時点で、彼らは異なるシミュレータバージョンに対して異なるディレクトリを使用し始めました。

于 2013-02-21T02:12:52.697 に答える
3

/varへの単なるシンボリックリンク/private/varです。最初のパスは、アクセスしようとした論理パスです。2 つ目は、シンボリック リンクが展開された同じパスです。

于 2013-02-21T01:02:08.497 に答える