1

Xcode 4.3

私は NSError** に関する SO の質問を読んだので、Xcode 4.3 で推奨されているわずかに異なる構文を使用する簡単なテスト プログラムを作成しました (以下を__autoreleasing参照)。正しく機能しているように見えます。とにかく、単純なファイル リーダーで、ファイルが見つからない場合はエラーを出力します。

質問

NSError の初期化、 を使用した引数の受け渡し&、およびエラー状態のチェックが正しいかどうかを知りたいです。また、メソッドでは、とreadFileAndSplit..の大きな違いに気付きました。実際、エラー状態が発生しない場合は機能しません。if(!*error)if(!error)if(!error)

エラー状態の可能性があるファイル読み取り方法

 -(NSArray*) readFileAndSplitLinesIntoArray:(NSError *__autoreleasing *) error {
    NSString* rawFileContents =
          [NSString stringWithContentsOfFile:@"props.txt"
                                    encoding:NSUTF8StringEncoding    
                                       error:error
    NSArray* fileContentsAsArray = nil;  
    if(!*error)
          fileContentsAsArray = 
                [rawFileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

    return fileContentsAsArray;

発信者

SimpleFileReader* reader = ...
NSError* fileError = nil;
NSArray* array = [reader readFileAndSplitLinesIntoArray: &fileError];

if(fileError){
  NSLog(@"Error was : %@, with code: %li", 
       [fileError localizedDescription],(long)[fileError code]);
} 
4

1 に答える 1

3

いくつかの問題があります。

まず、Apple の Error Handling Programming Guideに従って、NSError ではなく、メソッドの戻り値をチェックして、メソッドが失敗したかどうかを判断する必要があります。メソッドが失敗した場合にのみ、追加のエラー情報を取得するために NSError を使用します。

例えば:

NSArray* fileContentsAsArray = nil;
NSString* rawFileContents = [NSString stringWithContentsOfFile:@"props.txt"
                                encoding:NSUTF8StringEncoding    
                                   error:error];
if (rawFileContents)
{
    // Method succeeded
    fileContentsAsArray = [rawFileContents ...];
}

return fileContentsAsArray; // may be nil

第 2 に、NSError 出力パラメータは通常オプションであり、NULL の場合があります。ただし、NULL エラー変数をメソッドに渡すと、次の行でクラッシュします。

if (!*error) { 

NULL ポインターを逆参照しているためです。代わりに、次のように、ポインターを参照する前に常に NULL をチェックする必要があります。

if (error && *error) 
{
    // Do something with the error info
}

ただし、上記のようにメソッドを書き直すと、エラー変数にまったくアクセスしなくなります。

于 2012-09-24T02:54:23.060 に答える