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

时间:2014-11-25 21:55:21

标签: objective-c crash nserror

我有以下情况:

我的域类获取一些输入验证它,如果验证通过,则继续保存数据。 当控制流到达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;
}

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

1 个答案:

答案 0 :(得分:3)

如果你有这个方法:

- (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不是有效指针并且会导致崩溃。