Ios 可选链接上的EXC_断点

Ios 可选链接上的EXC_断点,ios,objective-c,iphone,swift,Ios,Objective C,Iphone,Swift,我是Swift新手,但我是Objective-c方面经验丰富的iOS开发人员。 目前,crashlytics已经向单个用户报告了EXC_断点崩溃,但这是系统性的。 我试过使用多个设备和操作系统版本,但无法复制 行是: if(RealmManager.sharedInstance()?.loggedUser()?.agreementPhotoRead.boolValue ?? false || PreferencesManager.getTutorialDone(forEmail: RealmMa

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

行是:

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]];
}

问题是,
stringByAppendingString
方法在其输入参数
NSString
nil
时实际上不起作用,如中所述

如果aString为零,则引发NSInvalidArgumentException

在调用
getTutorialDoneForEmail
中的方法之前,您应该执行
nil
检查,或者更好地,使
getTutorialDoneForEmail
仅接受非
nil
NSString
s

+ (BOOL)getTutorialDoneForEmail:(nonnull NSString *)email {
    return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}
此外,如果
agreementPhotoRead
可以是
nil
,则需要将其调用链接到
boolValue
,否则Swift会将其作为隐式展开的可选项处理,如果
agreementPhotoRead
实际上是
nil
,则会导致运行时错误

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

问题是,
stringByAppendingString
方法在其输入参数
NSString
nil
时实际上不起作用,如中所述

如果aString为零,则引发NSInvalidArgumentException

在调用
getTutorialDoneForEmail
中的方法之前,您应该执行
nil
检查,或者更好地,使
getTutorialDoneForEmail
仅接受非
nil
NSString
s

+ (BOOL)getTutorialDoneForEmail:(nonnull NSString *)email {
    return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}
此外,如果
agreementPhotoRead
可以是
nil
,则需要将其调用链接到
boolValue
,否则Swift会将其作为隐式展开的可选项处理,如果
agreementPhotoRead
实际上是
nil
,则会导致运行时错误

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

方法:
PreferencesManager.getTutorialDone(forEmail:)
是否可以处理一个可选值,该值也可以为零?@LoVo添加了方法体:
PreferencesManager.getTutorialDone(forEmail:)
可以处理一个可选值,该值也可以为零?@LoVo添加了该方法的主体,以及为什么Crashlytics在
连续记录上报告一个
EXC_断点
,而不是在
getTutorialDone
上报告一个
NSInvalidArgumentException
?我还确信有问题的用户正在传递一封电子邮件,而不是
nil
值。@AlessioCrestani您可以通过修改对
getTutorialDone(forEmail:)
的调用来轻松地测试这一点,以便传递
nil
值,就像
if(realmanager.sharedInstance()?.loggedUser())?.agreementPhotoRead.boolValue??false | | PreferencesManager.getTutorialDone(forEmail:nil)){}
Btw在您的问题中没有提到
continueToRecording
方法…
continueToRecording()
是以
if
语句作为第一行的方法,抱歉,如果我以前没有见过它。@AlessioCrestani另一个可能的错误点可能不是可选的链接
agreementPhotoRead.boolValue
,但如果没有更多的上下文,我无法确定。当swift预期不正确时,许多错误仅显示为EXC_BAD_指令或EXC_断点,并且仅触发运行时陷阱,并且应用程序入口点未用swift编写。其中一些是:-强制展开nil,-强制尝试表达式(try!)产生错误,-对数组进行越界索引,-前置条件失败,-断言失败,-fatalError Calls和为什么Crashlytics在
持续录制上报告
EXC_断点
,而在
GetTutorialOne上报告
NSInvalidArgumentException
?我还确信有问题的用户正在传递一封电子邮件,而不是
nil
值。@AlessioCrestani您可以通过修改对
getTutorialDone(forEmail:)
的调用来轻松地测试这一点,以便传递
nil
值,就像
if(realmanager.sharedInstance()?.loggedUser())?.agreementPhotoRead.boolValue??false | | PreferencesManager.getTutorialDone(forEmail:nil)){}
Btw在您的问题中没有提到
continueToRecording
方法…
continueToRecording()
是以
if
语句作为第一行的方法,抱歉,如果我以前没有见过它。@AlessioCrestani另一个可能的错误点可能不是可选的链接
agreementPhotoRead.boolValue
,但如果没有更多的上下文,我无法确定。当swift预期不正确时,许多错误仅显示为EXC_BAD_指令或EXC_断点,并且仅触发运行时陷阱,并且应用程序入口点未用swift编写。其中一些是:-强制展开nil,-强制尝试表达式(try!)产生错误,-对数组进行越界索引,-前置条件失败,-断言失败,-fatalError调用