什么可能导致Realm崩溃?

时间:2018-06-17 16:30:05

标签: ios swift 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>

或者知道造成这种异常的原因是什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您还应该记住,Swift中的常见编码实践是将函数的开括号放在与函数声明相同的行中,对于if语句也是如此。