提问人:cj- 提问时间:11/16/2023 更新时间:11/16/2023 访问量:18
使用 NSData 调用抽象函数时出现异常
Exception when calling abstract function with NSData
问:
我正在使用 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
答: 暂无答案
评论