问题描述
让我们假设一个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
示例项目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
因此,我建议您使用正确的映射类型,而不要使用其他映射类型。