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

Kotlin-Swift interop issue: ArrayList has wrong count value when passed as NSMutableArray from Swift Code for Release builds

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

我在 KMP 模块中有一个函数 sampleFuncForStringArrayList(names: ArrayList<String>),它打印计数并迭代并打印 ArrayList 项目。

当我从 iOS 示例应用程序调用此函数时,出现索引超出范围异常 因为 NSMutableArray count 在 iOS 应用程序环境 中是 2,当在 KMP 模块中作为 ArrayList 收到时 count24576.

此问题仅发生在 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

所以我建议您使用正确的映射类型,而不是另一种。