Xcode 4.3
我已经阅读了关于NSError **的SO问题,所以我写了一个简单的测试程序,它使用了Xcode 4.3推荐的稍微不同的语法(参见下面的__autoreleasing
),所以我不是100%肯定如果这是正确的,虽然代码似乎确实正常运行。无论如何,只是一个简单的文件阅读器,如果找不到文件就会输出错误。
问题
想知道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]);
}
答案 0 :(得分:3)
有几个问题。
首先,根据Apple's Error Handling Programming Guide,您应该检查方法的返回值以确定方法是否失败,而不是NSError。只有在方法失败的情况下,才使用NSError获取其他错误信息。
E.g:
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
}
但是,如果您重写上述方法,则根本不会访问错误变量。