我在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>
或者知道造成这种异常的原因是什么?
答案 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
语句也是如此。