В моем приложении у меня есть два класса, класс swift, унаследованный от класса kotlin:
Класс Swift:
public class MySensor: RawSensor
[...]
public override func notifyChanged(values: KotlinFloatArray) {
super.notifyChanged(values: values)
}
}
класс Kotlin:
package com.mycompany.myapp.mypackage.sensors.rawsensors
import com.mycompany.myapp.mypackage.util.Observable
abstract class RawSensor : Observable() {
protected abstract val sensorDataType: RawSensorData.SensorDataType
abstract val currentTime: Long
protected open fun notifyChanged(values: FloatArray) {
notifyObservers(RawSensorData(values, sensorDataType, currentTime))
}
abstract fun start()
abstract fun stop()
}
При вызове super.notifyChanged(values: values)
происходит сбой приложения со следующей ошибкой:
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared <object>@83cb47c8 from other thread
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared <object>@83cb4788 from other thread
at 0 MyNativeFramework 0x00000001048815dc kfun:kotlin.Exception.<init>(kotlin.String?)kotlin.Exception + 84
at 1 MyNativeFramework 0x00000001048805f8 kfun:kotlin.RuntimeException.<init>(kotlin.String?)kotlin.RuntimeException + 84
at 2 MyNativeFramework 0x00000001048ac630 kfun:kotlin.native.IncorrectDereferenceException.<init>(kotlin.String)kotlin.native.IncorrectDereferenceException + 84
at 3 MyNativeFramework 0x00000001048ad7bc ThrowIllegalObjectSharingException + 496
at 4 MyNativeFramework 0x0000000104a6f1a0 _ZNK16KRefSharedHolder3refEv + 240
at 5 MyNativeFramework 0x0000000104a6eeb0 -[KotlinBase retain] + 52
at 6 libobjc.A.dylib 0x00000001aad36288 objc_retain + 88
at 7 PositionKit 0x000000010449454c $s11PositionKit21MySensorC13notifyChanged6valuesySo19MyNativeLibraryKotlinFloatArrayC_tFTo + 56
at 8 PositionKit 0x0000000104493fa0 $s11PositionKit21MySensorC5startyyFySo19CMAccelerometerDataCSg_s5Error_pSgtcfU_ + 796
at 9 PositionKit 0x00000001044941ec $sSo19CMAccelerometerDataCSgs5Error_pSgIeggg_ACSo7NSErrorCSgIeyByy_TR + 152
at 10 CoreMotion 0x00000001b7c44a8c CLClientCreateIso6709Notation + 30848
at 11 Foundation 0x00000001ab3d1c60 672CF0CB-4951-3B91-89DF-55E953AEA00F + 1170528
at 12 Foundation 0x00000001ab2d37e8 672CF0CB-4951-3B91-89DF-55E953AEA00F + 129000
at 13 Foundation 0x00000001ab3d3fbc 672CF0CB-4951-3B91-89DF-55E953AEA00F + 1179580
at 14 Foundation 0x00000001ab2d3464 672CF0CB-4951-3B91-89DF-55E953AEA00F + 128100
at 15 Foundation 0x00000001ab3d49e8 672CF0CB-4951-3B91-89DF-55E953AEA00F + 1182184
at 16 Foundation 0x00000001ab3d44a8 672CF0CB-4951-3B91-89DF-55E953AEA00F + 1180840
at 17 libdispatch.dylib 0x0000000104f59a48 _dispatch_block_async_invoke2 + 144
at 18 libdispatch.dylib 0x0000000104f4b2a8 _dispatch_client_callout + 20
at 19 libdispatch.dylib 0x0000000104f5935c _dispatch_main_queue_callback_4CF + 1376
at 20 CoreFoundation 0x00000001aaf7ce20 97285ACB-7B21-393A-ABF6-03F1DBB5D2A2 + 712224
at 21 CoreFoundation 0x00000001aaf77b7c 97285ACB-7B21-393A-ABF6-03F1DBB5D2A2 + 691068
at 22 CoreFoundation 0x00000001aaf77098 CFRunLoopRunSpecific + 480
at 23 GraphicsServices 0x00000001b50e1534 GSEventRunModal + 108
at 24 UIKitCore 0x00000001af0977ac UIApplicationMain + 1940
at 25 MyTestApp 0x00000001044383a4 main + 76
at 26 libdyld.dylib 0x00000001aadf6f30 0DC9A4BA-C3E8-3487-99DB-1B5C86597AF5 + 3888
at 0 MyNativeFramework 0x00000001048815dc kfun:kotlin.Exception.<init>(kotlin.String?)kotlin.Exception + 84
at 1 MyNativeFramework 0x00000001048805f8 kfun:kotlin.RuntimeException.<init>(kotlin.String?)kotlin.RuntimeException + 84
at 2 MyNativeFramework 0x00000001048ac630 kfun:kotlin.native.IncorrectDereferenceException.<init>(kotlin.String)kotlin.native.IncorrectDereferenceException + 84
at 3 MyNativeFramework 0x00000001048ad7bc ThrowIllegalObjectSharingException + 496
at 4 MyNativeFramework x0000000104a6f1a0 _ZNK16KRefSharedHolder3refEv + 240
at 5 MyNativeFramework 0x0000000104a6eff4 -[KotlinBase release] + 48
at 6 libobjc.A.dylib 0x00000001aad36408 objc_release + 136
at 7 PositionKit 0x00000001044967e8 $s11PositionKit17MySensorC5startyyFySo14CMDeviceMotionCSg_s5Error_pSgtcfU_ + 684(lldb)
(имена были изменены для защиты закрытого исходного кода)
Что я делаю не так? Должен ли я как-то пометить массив с плавающей точкой как общий? Я читал о замораживании данных в Kotlin / Native, но, похоже, это применимо только к объектам в контексте kotlin.