ios - 什么可能导致 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>
或者知道是什么导致了这个异常?
解决方案
崩溃的一个可能原因是您正在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
语句也一样。
推荐阅读
- angular - 如何阻止材料下拉自动完成选择在 Angular 8/9 中触发另一个搜索查询?
- api - Gerrit API - 使用可选的 WEB_LINKS 获取 CommitInfo - 查询语法
- python - Python:我如何确定投掷时使球运动最远的角度?
- express - Loopback 4 使用带有环回的现有快速服务器
- php - 如何在php中加密和解密字符串?
- python - Python 如果我调用我的函数,我应该如何解决这个问题,它返回函数对象
- flutter - Flutter google_pay 实现
- python - matplotlib.pyplot show() 不清除图形
- javascript - Vue 与 Muuri - 如何使用?
- asyncfileupload - Blazor 文件上传 IFormFile