- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试使用共享模块 KMM 将图像上传到 aws s3 服务器。它在 Android 中工作得很好,但在 iOS 中我遇到了这个问题:- 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享
现在,尽管我对此进行了尽可能多的搜索,但我知道它与 frozen()
相关,但我不确定它是什么以及如何解决这个问题。
代码:-
actual class ClassName {
init {
ensureNeverFrozen()
}
actual fun imageUpload() {
var credentialsProvider = AWSCognitoCredentialsProvider(regionType = // Region here, identityPoolId = //identityPoolId here)
var configuration = AWSServiceConfiguration(region = // Region here, credentialsProvider = //credentialsProvider here)
AWSServiceManager.defaultServiceManager()?.defaultServiceConfiguration = configuration
val expression = AWSS3TransferUtilityUploadExpression()
// Start uploading using AWSS3TransferUtility
val awsTransferUtility = AWSS3TransferUtility.defaultS3TransferUtility()
val completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock
completionHandler = { _: AWSS3TransferUtilityUploadTask?, error: NSError? ->
if (error == nil) {
val url = AWSS3.defaultS3().configuration.endpoint()?.URL()
val publicURL = url?.URLByAppendingPathComponent("bucketName")?.URLByAppendingPathComponent("fileName")
// Image Upload Complete
} else {
// Image Upload failure
}
}
awsTransferUtility.uploadFile(
fileUrl!!,
bucket = "bucketName",
key = "fileName",
contentType = ".image",
expression = expression,
completionHandler = completionHandler. // Error pointed on this line
)
}
}
现在,只要我调用该函数,我的应用程序就会崩溃,并将错误指向 completionHandler
。
错误日志:-
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared ClassName.$imageUpload$lambda-1$lambda-0$FUNCTION_REFERENCE$1@2803dc8 from other thread
at 0 iosApp 0x000000010cc1984f kfun:kotlin.Throwable#<init>(kotlin.String?){} + 95
at 1 iosApp 0x000000010cc138cd kfun:kotlin.Exception#<init>(kotlin.String?){} + 93
at 2 iosApp 0x000000010cc139fd kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 93
at 3 iosApp 0x000000010cc327fd kfun:kotlin.native.IncorrectDereferenceException#<init>(kotlin.String){} + 93
at 4 iosApp 0x000000010cc3461f ThrowIllegalObjectSharingException + 623
at 5 iosApp 0x000000010cd16fc2 _ZN12_GLOBAL__N_128throwIllegalSharingExceptionEP9ObjHeader + 34
at 6 iosApp 0x000000010cd170fd _ZN12_GLOBAL__N_136terminateWithIllegalSharingExceptionEP9ObjHeader + 13
at 7 iosApp 0x000000010cd1af0a _ZNK16KRefSharedHolder3refIL11ErrorPolicy3EEEP9ObjHeaderv + 58
at 8 iosApp 0x000000010cbf53ca _ZL39Kotlin_Interop_unwrapKotlinObjectHolderP11objc_object + 42
at 9 iosApp 0x000000010cbee050 _4b4d4d4c69623a736861726564_knbridge15 + 224
at 10 AWSS3 0x000000010d84509e -[AWSS3TransferUtility URLSession:task:didCompleteWithError:] + 4814
最佳答案
原生并发模型 available用于预览。查看New memory model migration guide 。发布后您不应该遇到任何此类问题,但在此之前上述答案都是有效的。
尝试调用completionHandler.freeze()
或者,将处理程序移动到函数调用(不将其存储在变量中)。
如果在处理程序内部您使用外部作用域中的一些变量,它们可能也需要卡住。如果前两种方法都不起作用,请尝试仅用 print()
替换完成内容,看看是否有帮助,如果有帮助,请通过逐一取消注释部分代码来本地化有问题的行。
KMM 并发模型禁止从不同线程访问可变对象,并且 freeze
使对象不可变,以便可以从不同线程使用它。
使用协程,对象会在需要时自动卡住,但是当您在没有协程的情况下切换线程时,您必须手动完成。
这正是这里发生的情况:AWS 从另一个线程调用 completionHandler
(这对于完成方法来说很常见)
在此处查看有关并发模型的更多信息:https://kotlinlang.org/docs/mobile/concurrency-overview.html
这种行为是我们目前必须使用 KMM 来管理的,但很快就会改变,这是 KMM 从 alpha 版本到发布版的主要阻碍因素,JetBrains 团队专注于解决这个特定问题,因此我们不这样做不必再使用freeze()
。
关于android - 线程中的 KMM In CorrectDereferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68625732/
我是 KMM 的新手,我正在尝试将 KMM 项目作为一个 pod 集成到我的示例 Xcode 项目中。我可以将 KMM Pod 链接到我的 Xcode 项目。但是,如果我尝试调用其中一个函数,则会产生
我一直在尝试使用共享模块 KMM 将图像上传到 aws s3 服务器。它在 Android 中工作得很好,但在 iOS 中我遇到了这个问题:- 未捕获的 Kotlin 异常:kotlin.native
我有一个 KMM 应用程序,其中 android 目标使用 Jetpack Compose。尝试使用可绘制资源时出现以下错误: e: [...]/OnboardingScreen.kt: (33, 4
在原生 android 项目中,我们可以定义 BuildConfig 变量,这些变量可以根据所选的构建类型(调试或发布)进行更改。为此,我们可以在应用程序级别的 gradle 文件中添加以下代码 bu
我正在尝试将一些业务逻辑从我的 iOS 应用程序转移到 KMM。当我突然开始在工作室遇到问题时,我已经做了一些工作。它没有构建,有奇怪的 metaspace 错误,等等。老实说,我在我的项目周围打了几
我有一个 AndrodiStudio KMM 项目,我想添加一个 JS 目标。 鉴于 JS 开发仅在 IntelliJ 中可用,我希望我必须在 IDEA 中打开项目添加一个“模块”——但我什至不知道选
我需要为 iOS 和 Android 构建一个应用程序。 重新启动 Android Studio 后出现此错误。 Kotlin Multiplatform Mobile plugin issue Ko
我正在关注 KotlinLang.org 中的“创建您的第一个多平台应用程序”教程。一切正常,直到我尝试在 iOS 机器上运行该示例。设备模拟器在很长一段时间后打开,但应用程序未在其上运行。我尝试先启
我是 KMM 的初学者,刚刚在 Macbook M1 Pro 上创建了一个新的 KMM 应用程序项目。没有代码更改,这只是我正在使用的 hello world 应用程序。我已经能够成功地为 andro
SQLDelight 仍被标记为 Maven 存储库中的实验库 here ,尽管第一个版本似乎是在 2018 年 10 月发布的。 我在 KMM 中制作了一个示例应用程序,我可以在其中插入/删除行,到
SQLDelight 仍被标记为 Maven 存储库中的实验库 here ,尽管第一个版本似乎是在 2018 年 10 月发布的。 我在 KMM 中制作了一个示例应用程序,我可以在其中插入/删除行,到
我们正在尝试为 ios 和 android 构建 KMM(Kotlin 多平台移动)应用程序。此项目中包含 c/c++ 模块。在 iOS 构建中,我们从 .h 文件中收到此错误: error: use
将 Xcode 更新到 13.0 后,我无法运行使用 Kotlin Multiplatform 的 iOS 应用程序。 构建失败,Command PhaseScriptExecution failed
我正在按照 https://kotlinlang.org/docs/mobile/integrate-in-existing-app.htm 中的 KMM 教程工作.当我到达步骤 ./gradlew
我关注了KMM hands-on tutorial关于如何使用 KMM 构建示例应用程序,我能够成功完成所有步骤! (Yu-huu!)现在我正在尝试在生产应用程序中做一个小的 POC。所以我创建了一个
这个问题已经有答案了: Unable to add apple device in Android studio (2 个回答) 已关闭 3 年前。 我对 KMM 完全陌生(Kotlin Multip
这个问题已经有答案了: Unable to add apple device in Android studio (2 个回答) 已关闭 3 年前。 我对 KMM 完全陌生(Kotlin Multip
我无法在 Android Studio 中为我的 Swift 代码设置断点。我认为 KMM 插件允许这样做。有什么办法可以实现吗? 如何在 iOS 中调试我的 iOS UI + 共享业务逻辑? 最佳答
我正在尝试使用 coroutines在 Kotlin Multiplatform项目。我也没有经验。 我正在尝试调用此函数 fun startFlow { coroutineScope.lau
我使用 KMM 向导在 Android Studio 中创建了一个新项目。我在关注 handson tutorial我注意到我没有在某些目录中创建包的选项。具体来说,在“共享”模块内部,只有 andr
我是一名优秀的程序员,十分优秀!