创建 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 时,为啥我的应用程序会崩溃?