1

Xcode 4.3

我已经阅读了关于 NSError** 的 SO 问题,所以我编写了一个简单的测试程序,它使用了 Xcode 4.3 推荐的稍微不同的语法(见__autoreleasing下文),所以我不能 100% 确定这是否正确,尽管代码似乎运行正常。无论如何,只是一个简单的文件阅读器,如果找不到文件,则会打印错误。

问题

想知道 NSError 初始化、参数传递 using&和错误条件检查是否正确。此外,在该方法中,我注意到andreadFileAndSplit..之间存在很大差异,实际上,当没有引发错误条件时,它不起作用。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 的错误处理编程指南,您应该检查方法的返回值以确定方法是否失败,而不是 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

其次,NSError out 参数通常是可选的,并且可能为 NULL。但是,如果您将 NULL 错误变量传递给您的方法,它将在这一行崩溃:

if (!*error) { 

因为您要取消引用 NULL 指针。相反,您必须始终在引用指针之前检查 NULL,如下所示:

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

但是,如果您按照上面的说明重写方法,那么您根本不会访问错误变量。

于 2012-09-24T02:54:23.060 回答