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 收到时 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
所以我建议您使用正确的映射类型,而不是另一种。
让我们假设一个 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
所以我建议您使用正确的映射类型,而不是另一种。