- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Kotlin MPP(Multiplatform) 开发 Android 和 iOS 之间的共享库。但是我在 iOS 中遇到了线程问题。对于我在 iOS 中的应用程序,我在主线程中建立对象,但它可能会调用另一个线程中的函数并抛出此异常,如下所示:
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared example.api.DrivingBehaviorDetector@397cba8 from other thread
at 0 DrivingBehaviorDetector 0x00000001037619d7 kfun:kotlin.Throwable.<init>(kotlin.String?)kotlin.Throwable + 87
at 1 DrivingBehaviorDetector 0x000000010375bca5 kfun:kotlin.Exception.<init>(kotlin.String?)kotlin.Exception + 85
at 2 DrivingBehaviorDetector 0x000000010375b9a5 kfun:kotlin.RuntimeException.<init>(kotlin.String?)kotlin.RuntimeException + 85
at 3 DrivingBehaviorDetector 0x0000000103781395 kfun:kotlin.native.IncorrectDereferenceException.<init>(kotlin.String)kotlin.native.IncorrectDereferenceException + 85
at 4 DrivingBehaviorDetector 0x0000000103782568 ThrowIllegalObjectSharingException + 744
at 5 DrivingBehaviorDetector 0x00000001037d72bc _ZNK27BackRefFromAssociatedObject19ensureRefAccessibleEv + 76
at 6 DrivingBehaviorDetector 0x00000001037c97c3 -[KotlinBase toKotlin:] + 35
at 7 DrivingBehaviorDetector 0x00000001037e3ef1 Kotlin_ObjCExport_refFromObjC + 65
at 8 DrivingBehaviorDetector 0x00000001037c4e37 objc2kotlin.125 + 167
at 9 Test 0x000000010340224d $sIeg_IeyB_TR + 45 (/Users/james/Documents/Projects/go/TestMPPforiOS/<compiler-generated>:<unknown>)
at 10 libdispatch.dylib 0x0000000103959dd4 _dispatch_call_block_and_release + 12
at 11 libdispatch.dylib 0x000000010395ad48 _dispatch_client_callout + 8
at 12 libdispatch.dylib 0x000000010396c460 _dispatch_root_queue_drain + 819
at 13 libdispatch.dylib 0x000000010396cb96 _dispatch_worker_thread2 + 132
at 14 libsystem_pthread.dylib 0x00007fff5245f6b3 _pthread_wqthread + 583
at 15 libsystem_pthread.dylib 0x00007fff5245f3fd start_wqthread + 13
(lldb)
我调查了这些文章中的解决方案:
Kotlin/Native 中的不变性:Immutability in Kotlin/Native
协程和 K/N 的不可变性:Coroutines and Immutability of K/N .
我的API(共享库)入口如下:
class DrivingBehaviorDetector (
private var gravity:Vector?,
private var front:Vector?,
onGravityOrFrontChanged: ((newGravity: Vector?, newFront: Vector?, timestamp: Long) -> Unit)?,
onDrivingEventDetected: ((event: DrivingEvent) -> Unit)?
) {
private val lowPassFilter = LowPassFilter()
private val accProcessor = AccProcessor(gravity, front, onGravityOrFrontChanged, onDrivingEventDetected)
init {
gravity = gravity?.toCoreUnit()
front = front?.toCoreUnit()
}
fun addData(data:Acceleration) {
val rawAcc = data.toCoreUnit()
val filterAcc = lowPassFilter.lowPass(rawAcc)
accProcessor.addData(filterAcc)
}
fun addData(data:List<Acceleration>) {
for(acc in data) {
addData(acc)
}
}
}
我们可以注意到 API 非常简单,只需提供大量数据并从一些计算中回调结果。但是在iOS中抛出异常,代码如下:
let drivingBehaviorDetector = DrivingBehaviorDetector(gravity: nil, front: nil, onGravityOrFrontChanged: { (newGravity, newFront, timestamp) in
print("newGravity = \(newGravity)")
print("newFront = \(newFront)")
}) { (event) in
print("event = \(event.description())")
}
let acc1 = Acceleration(vector: Vector(x: 0, y: 0, z: 0))
let acc2 = Acceleration(vector: Vector(x: 0, y: 100, z: 0))
drivingBehaviorDetector.addData(data: acc1)
DispatchQueue.global(qos: .background).async {
drivingBehaviorDetector.addData(data: acc2)
}
我能想到的唯一解决方案是强制在同一个线程中使用 API,但这似乎有点奇怪。是否可以通过修改共享库来解决这个问题。因为 mu 的用法很简单,只有一个“DrivingBehaviorDetector”,但它可以在不同的线程中调用“addData”函数。谢谢回答。
最佳答案
对于 Kotlin/Native,必须明确定义正确的并发行为,以避免竞争。在这种特殊情况下,有几种选择:
drivingBehaviorDetector
实例(例如,通过在构造函数中调用 freeze()
),并使用并发实现 addData()
-安全机制,如卡住样本数据链表或使用Swift集合实例drivingBehaviorDetector
实例的所有者,仅在该上下文/线程/队列中实例化并使用此实例,并通过调度程序 API 强制执行关于swift - 未捕获的 Kotlin 异常 : kotlin. native.IncorrectDereferenceException:非法尝试访问非共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60180941/
我正在查看Kotlin Github page我注意到 Kotlin 语言本身大部分是用 Kotlin 编写的:我只是想知道,一种语言怎么可能大部分都是用它自己的语言编写的?在您可以使用正在创建的语言
我有以下非常简单的 kotlin 代码来演示中缀函数 com.lopushen.demo.presentation 包 fun main(args: Array) { print("Hello
我在 Java 中有 2 个模型类,其中一个扩展了另一个 @UseStag public class GenericMessages extends NavigationLocalizationMap
Kotlin 代码 runBlocking { flow { for (i in 0..4) { println("Emit $i")
这三个 Kotlin 插件和它们的实际作用有什么区别? plugins { id 'kotlin-android' id 'org.jetbrains.kotlin.android'
我正在为某些现有库添加 Kotlin 原生 linuxX64 目标支持。库已成功编译,但在运行测试用例时,出现以下运行时错误: kotlin.native.concurrent.InvalidMuta
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我创建了一个类并向其添加了一个与成员函数具有相同签名的扩展,并执行了这个方法,它总是执行成员方法。 class Worker { fun work() = "...working" } fun
我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说一直是个问题。在下面的示例代码中,我想通过使用函数“changeNum”修改变量“num”的值。但当然,Kotlin
现在,我正在尝试用 Kotlin 重写我的 Java 应用程序。然后,我遇到了日志语句,比如 log.info("do the print thing for {}", arg); 所以我有两种方法可
有点出名article关于许多语言的异步编程模型的状态,指出它们存在“颜色”问题,特别是将生态系统分为两个独立的世界:异步和非异步。以下是这种语言的属性: 每个函数都有一种颜色,红色或蓝色(例如asy
因为 KDoc 文档生成引擎是 abandoned in favor of Dokka , Kotlin 文档应该称为“KDoc 注释”,还是“Dokka 注释”? 最佳答案 如所述here , KD
我想在可空对象上传递函数引用。以 Android 为例,假设我想使用 Activity#onBackPressed来自作为该事件的子级的片段。 如果我想调用这个函数,我可以很容易地做到 activit
我有一个列表 (x, y)其中y只能是 0 或 1 这样 例如: [(3, 0), (3, 1), (5, 1)] [(5, 0), (3, 1), (5, 1)] [(1, 1), (3, 1),
从强类型语言的定义来看: A strongly-typed programming language is one in which each type of data (such as intege
这不能编译的事实是否意味着它们不是一流的类型? fun foo(s: String): Int = s.length // This won't compile. val bar = foo 有没有办
如果在 Java i++是一个表达式和 i++;是一个表达式语句,分号(;) 在 Kotlin 中是可选的,是 i++ Kotlin 中的表达式或表达式语句? 最佳答案 i++是一个表达式,因为它有一
代码(如下所示)是否正确?它取自 Kotlin-docs.pdf 的第 63 页,这也是 https://kotlinlang.org/docs/reference/generics.html 的最后
我正在尝试使用 Kotlin 为 Android 的一些全局 API 解析器(检查网络连接、调用 API 并通过来自源的单个调用返回格式化数据),并且在某些时候我不得不创建一个通用类型 object就
kotlinlang 中的任务: 使用月份变量重写此模式,使其与格式 13 JUN 1992(两位数字、一个空格、一个月份缩写、一个空格、四位数字)中的日期相匹配。 答案是:val month = "
我是一名优秀的程序员,十分优秀!