使用 NSData 调用抽象函数时出现异常

Exception when calling abstract function with NSData

提问人:cj- 提问时间:11/16/2023 更新时间:11/16/2023 访问量:18

问:

我正在使用 Kotlin Multiplatform 为 iOS 应用程序提供实用功能。在极少数情况下,当调用抽象函数(打算在 Objective-C 中实现)时,会发生“Objective-C 异常”。我能做些什么来修复或缓解此问题?

例外情况如下:

(lldb) po $arg1
*** Collection <__NSArrayM: 0x2833ad350> was mutated while being enumerated.
(null)


objc_exception_throw
kotlin2objc_kfun:com.agragps.mobile.receiver.Receiver#cleanWrites(kotlin.String?;platform.Foundation.NSData){}kotlin.Boolean
kfun:com.agragps.mobile.receiver.Receiver#cleanWrites(kotlin.String?;kotlin.ByteArray){}kotlin.Boolean
...

以下是相关的 Kotlin 代码:

actual open fun cleanWrites(header: String?, data: ByteArray): Boolean {
    return cleanWrites(header, data.toData()) // Objective-C exception here
}

abstract fun cleanWrites(header: String?, data: NSData): Boolean


@OptIn(ExperimentalForeignApi::class, BetaInteropApi::class)
fun ByteArray.toData(): NSData {
    return if (isEmpty())
        NSData.data()
    else
        memScoped {
            NSData.create(bytes = allocArrayOf(this@toData), length = [email protected]())
        }
}

下面是 kotlin2objc_kfun 的汇编代码部分:

    0x1062abb48 <+148>: bl     0x1064b9704               ; Kotlin_mm_switchThreadStateNative
    0x1062abb4c <+152>: ldr    x0, [sp, #0x28]
    0x1062abb50 <+156>: ldr    x1, [sp, #0x18]
    0x1062abb54 <+160>: ldr    x2, [sp, #0x20]
    0x1062abb58 <+164>: ldr    x3, [sp, #0x10]
    0x1062abb5c <+168>: bl     0x1065adfbc               ; symbol stub for: objc_msgSend
->  0x1062abb60 <+172>: str    w0, [sp, #0xc]
    0x1062abb64 <+176>: b      0x1062abb68               ; <+180>
    0x1062abb68 <+180>: ldr    x0, [sp, #0x20]
    0x1062abb6c <+184>: bl     0x1065adfe0               ; symbol stub for: objc_release
    0x1062abb70 <+188>: ldr    x0, [sp, #0x10]
    0x1062abb74 <+192>: bl     0x1065adfe0               ; symbol stub for: objc_release
    0x1062abb78 <+196>: bl     0x1064b977c               ; Kotlin_mm_switchThreadStateRunnable
Objective-C Kotlin Kotlin-Multiplatform

评论


答: 暂无答案