首页 > 解决方案 > 什么可能导致 Realm 崩溃?

问题描述

我在 Realm 中遇到了一个非常偶然的崩溃,我自己无法重现。

崩溃日志的回溯顶部如下:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x181832d8c __exceptionPreprocess + 228 (NSException.m:166)
1   libobjc.A.dylib                 0x1809ec5ec objc_exception_throw + 56 (objc-exception.mm:521)
2   Realm                           0x10061e858 invocation function for block in objc_object* (anonymous namespace)::makeBoxedGetter<realm::StringData>(unsigned long) + 304 (RLMObject_Private.hpp:45)
3   My App                          0x1001c239c DetailViewController.getTheTitleOfCaller() + 64 (DetailViewController.swift:1863)

getTheTitleOfCaller() 方法如下。

func getTheTitleOfCaller() -> String
    {
        var theTitle: String = ""
        if self.caller?.name != nil
        {
            theTitle = (self.caller?.name)!
        }
        else
        {
            theTitle = "Default title"
        }
        return theTitle
}

之前有没有人看到过 Realm 的这个异常: invocation function for block in objc_object* (anonymous namespace)::makeBoxedGetter<realm::StringData>

或者知道是什么导致了这个异常?

标签: iosswiftrealm

解决方案


崩溃的一个可能原因是您正在Optional以不安全的方式处理展开。您不应该使用 nil 检查然后强制展开,因为如果另一个线程在 nil 检查和强制展开之间访问相同的变量,您的代码将崩溃。使用可选绑定或默认值来安全地展开可选选项。

另一个可能的问题是get在函数名中使用了 ,因为 Realm 使用的是 Objective-C 运行时,所以你不应该使用 Swift 函数启动 Swift 函数get,因为 Obj-C 可能会将它们误认为是 getter,这可能会makeBoxedGetter导致碰撞。

getTitle函数也可以使用默认值简化为单行。我还更改了函数名称,以确保问题不是由其命名引起的。

func title() -> String {
    return self.caller?.name ?? "Default title"
}

您还应该记住,Swift 中常见的编码实践是将函数的左括号与函数声明放在同一行,if语句也一样。


推荐阅读