Kotlin-Swift互操作性问题:当从Swift代码发布版本作为NSMutableArray传递时,ArrayList的计数值错误

问题描述

让我们假设一个KMP项目设置为具有一个示例iOS应用,其中将KMP模块的输出框架添加为依赖项。

我在KMP模块中具有函数sampleFuncForStringArrayList(names: ArrayList<String>),该函数可打印计数并进行迭代并打印ArrayList项。

当我从iOS示例应用程序调用函数时,我得到的索引超出绑定异常 因为NSMutableArray count在iOS应用环境中为 2 ,当在KMP模块中作为ArrayList接收时,其count 24576。

此问题仅在releaseFramework中发生。 debugFramework 正常工作。

//Swift
let namesstringList = NSMutableArray(array: ["Alice","Bob"])
print("NSMutableArray COUNT : \(namesstringList.count)")
Main().sampleFuncForStringArrayList(names: namesstringList)


//Kotlin
public class Main {
    public fun sampleFuncForStringArrayList(names: ArrayList<String>){
        println("names.isNullOrEmpty() ${names.isNullOrEmpty()}")
        println("names.count ${names.count()}")
        names.forEach {
            println("Hello $it")
        }
    }
}

预期产量

NSMutableArray COUNT : 2
names.isNullOrEmpty() false
names.count 2
Hello Alice
Hello Bob

实际输出

NSMutableArray COUNT : 2
names.isNullOrEmpty() false
names.count 24576
CRASH

- CRASH -

示例项目ZIP:https://drive.google.com/file/d/1SgmW4hfeWaEeD3vcidnZ81Q9vMJsU9zJ/view?usp=sharing

解决方法

我尝试使用KMM设置(使用cocoapods),即使使用发行版,我也具有正确的预期行为,但是我使用了正确的kotlin/swift interop mapping类型MutableList

fun sampleFuncForStringMutableList(names: MutableList<String>) {
    println("names.isNullOrEmpty() ${names.isNullOrEmpty()}")
    println("names.count ${names.count()}")
    names.forEach {
        println("Hello $it")
    }
}

使用ArrayList时,我看到一个空数组,然后崩溃(与调试版本不同,我也看到了您的预期行为)。

let namesStringList = NSMutableArray(array: ["Alice","Bob"])
print("NSMutableArray COUNT : \(namesStringList.count)")
Main().sampleFuncForStringArrayList(names: namesStringList)
Main().sampleFuncForStringMutableList(names: namesStringList)
NSMutableArray COUNT : 2
names.isNullOrEmpty() true
names.count 0
names.isNullOrEmpty() false
names.count 2
Hello Alice
Hello Bob

因此,我建议您使用正确的映射类型,而不要使用其他映射类型。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...