我有以下情况:
我的域类获取一些输入验证它,如果验证通过,则继续保存数据。 当控制流到达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;
}
当我注释掉验证发生的所有行时,应用程序不会崩溃。 我不知道为什么会这样。有人能指出我正确的方向吗?
答案 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
不是有效指针并且会导致崩溃。