学会2个方面的内容,基本就可以上手NSError:
1、NSError对象的创建和解读
2、NSError对象的传递方式,通过委托方法回调方式、通过以NSerror对象指针的指针作为参数的方式
一、NSError的创建和解读
- (void)test { // 代码一 NSString *desc1 = NSLocalizedString(@"FileNotFound", @""); NSDictionary *info1 = @{NSLocalizedDescriptionKey : desc1}; NSError *error1 = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:info1]; NSLog(@"error1:%@", error1); // 代码二 NSString *desc2 = @"FileNotFound"; NSDictionary *info2 = @{@"NSiOSKey" : desc2}; NSError *error2 = [NSError errorWithDomain:@"iOSDomain" code:8888 userInfo:info2]; NSLog(@"error2:%@", error2); // 代码三 NSString *desc3 = @"FileNotFound"; NSDictionary *info3 = @{NSLocalizedDescriptionKey : desc3}; NSError *error3 = [NSError errorWithDomain:@"iOSDomain" code:8888 userInfo:info3]; NSLog(@"error3:%@", error3); // 代码四 NSString *desc4 = NSLocalizedString(@"FileNotFound", @""); /* NSLocalizedDescriptionKey、NSLocalizedFailureReasonErrorKey 等? */ NSDictionary *info4 = @{NSLocalizedDescriptionKey : desc4}; NSError *error4 = [NSError errorWithDomain:@"3CWDomain" code:111 userInfo:info4]; NSLog(@"error4:%@", error4); // 代码五 NSString *description = [error4 localizedDescription]; NSString *domian = [error4 domain]; NSInteger code = [error4 code]; NSDictionary *infoDic = [error4 userInfo]; NSString *descMesssage = [infoDic objectForKey:NSLocalizedDescriptionKey]; NSLog(@"description:%@ domian:%@ code:%ld descMesssage:%@", description, domian, code, descMesssage); }
打印的结果:
2021-08-05 13:31:38.549182+0800 OCTestLine[10570:258023] error1:Error Domain=NSCocoaErrorDomain Code=4 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound} 2021-08-05 13:31:38.549253+0800 OCTestLine[10570:258023] error2:Error Domain=iOSDomain Code=8888 "(null)" UserInfo={NSiOSKey=FileNotFound} 2021-08-05 13:31:38.549288+0800 OCTestLine[10570:258023] error3:Error Domain=iOSDomain Code=8888 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound} 2021-08-05 13:31:38.549333+0800 OCTestLine[10570:258023] error4:Error Domain=3CWDomain Code=111 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound} 2021-08-05 13:31:38.549358+0800 OCTestLine[10570:258023] description:FileNotFound domian:3CWDomain code:111 descMesssage:FileNotFound Program ended with exit code: 0
参数说明:
Code码可以自定义;
Domain指的是错误域,有4中主要的错误域,当然也可以自定义错误域;
UserInfo是NSDictionary实例,指的是用户信息字典,含有的信息类型包括错误的本地化信息和对支持对象的引用。
二、NSError的传递方式
一种方式就是通过委托方法,因为“委托者”会弱引用“委托对象”,即(weak)delegate。委托对象所指向的类会声明和定义“委托方法”,在需要的情况下,委托者会调用委托对象中的委托方法,故正在此时,将错误对象作为委托方法的参数,便传递给了“委托对象”。
第二种方式,是一种常见的OC编程惯例,将方法的最后一个参数设置为指向错误对象指针的指针(也称为双重间接模式)。通过这种方式可以使被调用的方法修改错误对象的指针,而且当出现错误时,返回与方法调用操作对应的错误对象。
- (void)test { NSError *error; BOOL success = [self changeValue:&error]; if (!success) { NSLog(@"error:%@", error); } } - (BOOL)changeValue:(NSError **)error { NSString *desc = NSLocalizedString(@"FileNotFound", @""); NSDictionary *info = @{NSLocalizedDescriptionKey : desc}; *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:info]; return NO; }