创建 NSError * 导致应用程序崩溃

Posted

技术标签:

【中文标题】创建 NSError * 导致应用程序崩溃【英文标题】:Creating NSError * results in application crash 【发布时间】:2014-11-25 21:55:21 【问题描述】:

我有以下情况:

我的域类得到一些输入来验证它,如果验证通过,它会继续保存数据。 当控制流到达 if 语句时,应用程序崩溃

- (BOOL)createGmailAccountWithName:(NSString *)name
                                 email:(NSString *)email
                           andPassword:(NSString *)password
                                 error: (NSError **) error 
  if (!name || name.length == 0) 
    *error = [self createError:@"name"];
    return NO;
  

  if (!email || email.length == 0) 
    *error = [self createError:@"email"];
    return NO;
  

  if (!password || password.length == 0) 
    *error = [self createError:@"password"];
    return NO;
  

  //..



-(NSError *) createError: (NSString *) field 

  NSString *errorMessage = [NSString stringWithFormat:@"Property %@ is required", field];

  NSDictionary *userInfo = @
    NSLocalizedFailureReasonErrorKey: NSLocalizedString(errorMessage, nil)
  ;

  NSError *error = [NSError errorWithDomain:ACCOUNT_STORE_ERROR_DOMAIN
  code:-1
  userInfo:userInfo];

  return error;

当我注释掉所有发生验证的行时,应用程序不会崩溃。 我不知道为什么会这样。谁能指出我正确的方向?

【问题讨论】:

您确定调用 createGmail 方法时带有错误对象吗?如果用 NULL 调用它,你会崩溃。您应该在取消引用之前检查该错误!= NULL。 它们不是用错误对象调用的。其实我只是想传入一个空指针,当验证失败时,它指向一个错误对象 好的,看看我发布的答案是否解决了这个问题。 【参考方案1】:

如果你有这个方法:

- (BOOL)createGmailAccountWithName:(NSString *)name
                             email:(NSString *)email
                       andPassword:(NSString *)password
                             error: (NSError **) error

人们可能会这样称呼它:

NSError *error;
[accountCreator createGmailAccountWithName:@"Ben" 
                                     email:@"foo@example.com" 
                               andPassword:@"pwd"
                                     error:&error];
if (error)

    NSLog(@"Hey I got an error: %@", error);

或者像这样:

[accountCreator createGmailAccountWithName:@"Ben"
                                     email:@"foo@example.com"
                               andPassword:@"pwd"
                                     error:NULL];
// I couldn't care less about an error

在第二种情况下,您的代码将尝试取消引用**error*error 不是有效指针,会导致崩溃。

【讨论】:

需要注意的是Cocoa约定是使用直接返回值——而不是if(error)——来判断是否传回了一个有效的错误对象。 @JoshCaswell 同意,尽管您会看到即使在 Cocoa 本身中也违反了约定。

以上是关于创建 NSError * 导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSString 失败,应用程序崩溃尝试 NSLog NSError

当我分配 NSError userInfo 来设置 NSDictionary 时,为啥我的应用程序会崩溃?

Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃

推送通知导致应用程序崩溃

Gamecenter 设置验证处理程序崩溃

调用 `reloadItems(at:)` 会导致程序崩溃