可选链接上的EXC_BREAKPOINT

时间:2018-11-29 10:13:10

标签: ios objective-c iphone swift

我是Swift的新手,但我是Objective-c上经验丰富的iOS开发人员。 目前,crashlytics已向单个用户报告了EXC_BREAKPOINT崩溃,但这是系统的。 我尝试了多种设备和操作系统版本,但无法复制。

行是:

if(RealmManager.sharedInstance()?.loggedUser()?.agreementPhotoRead.boolValue ?? false || PreferencesManager.getTutorialDone(forEmail: RealmManager.sharedInstance()?.loggedUser()?.email)){
    }

可选链接有什么问题? Swift版本是4.2。

编辑: geTutorialDone方法在Objective-C中。这里的代码:

+ (BOOL)getTutorialDoneForEmail:(NSString *)email
{
    return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}

1 个答案:

答案 0 :(得分:2)

问题在于,如果stringByAppendingString方法的输入参数NSStringnil(如documentation of the method中所述)实际上不起作用。

  

如果aString为nil,则引发NSInvalidArgumentException。

nil中调用该方法之前,应进行getTutorialDoneForEmail检查,甚至更好,使getTutorialDoneForEmail仅接受非{nil NSString s。 / p>

+ (BOOL)getTutorialDoneForEmail:(nonnull NSString *)email {
    return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}

此外,如果agreementPhotoRead可以是nil,则需要将其调用可选地链接到boolValue,否则Swift会将其作为隐式展开的可选处理,这将导致运行时万一agreementPhotoRead实际上是nil时出错。

RealmManager.sharedInstance()?.loggedUser()?.agreementPhotoRead?.boolValue