watchOS 6 WKInterfaceImage 在释放时崩溃

watchOS 6 WKInterfaceImage crash on deallocation

自 watchOS 6 SDK 的第一个测试版以来,如果使用 watchOS 6.0 SDK 编译,我的应用程序开始崩溃。 watchOS 6.1 不会出现这些问题,而在模拟器中出现的频率更高。 现在我已经能够确定问题所在:

我有一个 WKInterfaceImage 正在显示一个使用一系列图像制作动画的微调器。如果我有一个新的 WKInterfaceController 被推送来显示这样一个微调器,它会在视图被关闭时崩溃。 在内部使用 SPInterfaceImageView 似乎被释放了两次。

这是 Xcode 日志消息:

-[SPInterfaceImageView release]: message sent to deallocated instance 0x3971ed60

有没有人遇到过同样的问题?我猜这是 watchOS SDK 中的一个错误。

我无法提供任何源代码,因为这只是通过使用 Storyboards 发生的。我的开发语言是Swift。

亲切的问候
亚历山大·海尼希

好吧,我问了这个问题后,我终于找到了导致这个问题的原因!

如果您的 watchOS 应用程序使用像我在问题中描述的微调器这样的动画图像,则 watchOS 6 SDK 有必要在 WKInterfaceController 被关闭之前调用 image.stopAnimating()

这可以在 didDeactivate() 方法中完成,也可以在关闭图像视图时完成。仅仅显示隐藏图像视图是不够的!当图像视图具有固定大小时,它也有帮助。

我希望这对收到其中一些错误消息的任何人有所帮助: EXC_BAD_INSTRUCTION 在堆栈跟踪中具有 _UIImageContentContextualEffect .cxx_destruct

或上面提到的 -[SPInterfaceImageView release]: message sent to deallocated instance

我遇到了同样的问题,并设法通过为 startAnimatingWithImages(in:duration:repeatCount:)

repeatCount 参数传递一个非零值来解决这个问题

所以我得到了这样的结果:

setImageNamed("spinner")
startAnimatingWithImages(in: NSRange(location: 0, length: 6), duration: 0.75, repeatCount: 9999)

很奇怪,但它阻止了崩溃。