ios - 可选链上的 EXC_BREAKPOINT

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

最佳答案

问题是 stringByAppendingString 方法在其输入参数 NSStringnil 的情况下实际上不起作用,如 documentation of the method 中所述。

Raises an NSInvalidArgumentException if aString is nil.

在调用 getTutorialDoneForEmail 方法之前,你应该做一个 nil 检查,或者更好的是,让 getTutorialDoneForEmail 只接受非 nil NSStrings.

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

此外,如果 agreementPhotoRead 可以是 nil,你需要将它的调用可选地链接到 boolValue,否则 Swift 会将其作为隐式处理解包可选,如果 agreementPhotoRead 实际上是 nil,将导致运行时错误。

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

关于ios - 可选链上的 EXC_BREAKPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536560/

相关文章:

ios - UICollectionView 的滚动不良做法

javascript - 无法在 iphone safari 浏览器上设置本地存储

iphone - 如何阻止 UITableView 上的 reloadData 清除删除确认按钮?

ios - 使用 iOS 的 XE2/Firemonkey 下的 FindFirst() 有问题吗?

iphone - 如何从另一个由 IBAction 方法组成的类方法调用方法

objective-c - 具有多个输入参数的方法

iphone - 沿 Y 轴的 UIView 平移手势

ios - 如何在 iOS 的通用应用程序中定义启动屏幕 Storyboard图像大小?

ios - 如何阻止 UITableView 单元格覆盖内容?

ios - 为什么删除 UILaunchStoryboardName 会调整 ios 应用程序窗口的大小?