2012-09-24 18 views
1

Xcode 4.3如何初始化,传递参数,并使用NSError检查错误条件**

我读过NSError的SO问题,**,所以我写了使用由推荐一个稍微不同的语法简单的测试程序Xcode 4.3(请参阅下面的__autoreleasing),所以我不能100%确定这是否正确,尽管代码似乎正常工作。无论如何,只是一个简单的文件阅读器,如果找不到文件就会打印一个错误。

问题

想知道,如果NSError初始化参数传递使用&,并且错误条件检查是正确的。 此外,在readFileAndSplit..方法中,我注意到if(!*error)if(!error)之间的很大差异,实际上,if(!error)在没有发生错误情况时不起作用。

文件读取方法W /可能的错误条件

-(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]); 
} 
+2

我唯一需要改变的就是测试'rawFileContents'是否为'nil'而不是错误的存在。主要的返回值应该表示Cocoa中的成功或失败,如果我没有记错的话,那么在方法不成功的情况下,错误不能保证不存在。 –

+0

好的,好点,但无论如何检查错误,是'如果(!*错误)'正确?我发现这适用于'readFile ...'方法中的错误和非错误条件。我解引用双指针,如果它不是null,那么出错了,我假设这是检查的正确方法。 – raffian

+0

我会照你的意思去做。 –

回答

3

有几个问题。

首先,根据Apple's 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 

其次,NSError出参数通常可选的,并且可以为NULL。但是,如果你传递一个NULL错误变量到你的方法它会崩溃在这一行:

if (!*error) { 

因为你取消对NULL指针。相反,你必须始终引用指针,像这样前检查NULL:

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

但是,如果重写上面的方法,那么你将无法在所有访问错误变量指出。

+0

有道理,但对一件事感到困惑。在调用者中,我初始化了'NSError fileError = nil',并将其作为'&fileError'传递给'readFile ...',但不管是否加载文件,'if(!* error)'永远不会引发BAD ACCESS,它总是按预期工作...我错过了什么? – raffian

+0

您正在向您的fileError变量传递一个指针,并且该指针始终为非null(不管fileError的值如何)。相反,尝试不传递变量,例如'[reader readFileAndSplitLinesIntoArray:NULL]' – Darren

+0

好点(双关意图),该死的指针是棘手的,谢谢你的信息 – raffian