2

あちこち見て回っけどダメだった。

検討:

- (void) write: (NSString *) xId data:(NSData *) data forClass: (Class) c {
    NSFileManager * fm = [NSFileManager defaultManager] ;

    NSString * instancePath = [self instancePath:xId forClass: c] ;

    errno = 0 ;
    BOOL success = [fm createFileAtPath: instancePath
                               contents: data
                             attributes: nil] ;
    if (!success) {
        ::NSLog(@"Couldn't write to path: %@", instancePath) ;
        ::NSLog(@"Error was code: %d - message: %s", errno, strerror(errno));
    } else {
        ::NSLog(@"COULD write to path: %@", instancePath) ;
        ::NSLog(@"Error was code: %d - message: %s", errno, strerror(errno));
    }
}

次に出力します:

2013-03-22 18:59:27.177 otest[18490:303] COULD write to path: /Users/verec/Library/Application Support/iPhone Simulator/6.1/Documents/cal/ModelRepo/ModelRepo#0.sexp
2013-03-22 18:59:27.177 otest[18490:303] Error was code: 3 - message: No such process
2013-03-22 18:59:27.178 otest[18490:303] Couldn't write to path: /Users/verec/Library/Application Support/iPhone Simulator/6.1/Documents/cal/ModelContainer/20130322.sexp
2013-03-22 18:59:27.178 otest[18490:303] Error was code: 3 - message: No such process
  1. 最初のケース (「COULD」のケース) で「成功」が YES であるにもかかわらず、errno が 0 でないのはなぜですか?
  2. 最初のケース (「COULD」) では成功 = YES であるが、2 番目のケース (「できなかった」) では成功 = NO になる実際のパスの違いを誰でも見つけることができますか?

これは、OCUnit テスト、iOS 6.1 を実行する Xcode 4.6.1 シミュレーターの実行中です。

私はただ困惑しています:-(

4

2 に答える 2

3
  • 変数は通常、呼び出しが失敗しerrnoた場合にシステム呼び出し (および一部のライブラリ関数) によってのみ設定されます。システム コールが成功した場合は変更されず、以前のエラーからのゼロ以外の値が含まれる場合があります。

  • errnoシステムコールが失敗した直後に印刷または保存する必要があります。あなたの場合、

    NSLog(@"Couldn't write to path: %@", instancePath);
    

    実際には errno を変更します。(「そのようなプロセスはありません」が正しい失敗理由である可能性はほとんどありません。)

  • errno同じ理由で、失敗した後に正しい値が含まれていると仮定することはできませcreateFileAtPathん。私のテストでは実際にそうしましたが、このメソッドがerrno正しく設定/保存されることは文書化されていません。
于 2013-03-22T19:37:23.557 に答える