watchOS 6 WKInterfaceImage 在解除分配时崩溃

Posted

技术标签:

【中文标题】watchOS 6 WKInterfaceImage 在解除分配时崩溃【英文标题】:watchOS 6 WKInterfaceImage crash on deallocation 【发布时间】:2019-10-15 08:01:20 【问题描述】:

从 watchOS 6 SDK 的第一个测试版开始,如果使用 watchOS 6.0 SDK 编译,我的应用程序开始崩溃。 watchOS 6.1 不会出现这些问题,并且在模拟器中更常见。 现在我已经能够确定问题了:

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

这是 Xcode 日志消息:

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

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

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

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

【问题讨论】:

【参考方案1】:

好吧,在我问了这个问题之后,我终于发现了导致这个问题的原因!

如果您的 watchOS 应用使用动画图像,例如我在问题中描述的微调器,则 watchOS 6 SDK 必须在 WKInterfaceController 被解除之前调用 image.stopAnimating()

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

我希望这可以帮助任何收到这些错误消息的人: 堆栈跟踪中的 EXC_BAD_INSTRUCTION_UIImageContentContextualEffect .cxx_destruct 或者上面提到的-[SPInterfaceImageView release]: message sent to deallocated instance

【讨论】:

如果我还没有找到这个答案,我不确定我会被困多久。非常感谢! 一百万谢谢 - 疯狂地试图弄清楚发生了什么 仅作记录,我的情况略有不同,想在此记录。我们有一个场景,其中包含一个 WKInterfaceImage,在 IB 中动画设置为 Yes。但是,我们没有 IBOutlet,因此没有相应的 stopAnimating()。这导致了 Xcode 中的间歇性崩溃。在物理设备上没有看到相同的行为。添加插座并调用 stopAnimating 似乎停止了崩溃。似乎是模拟器或 WatchOS 问题,但解决方法可以补救【参考方案2】:

我遇到了同样的问题,并设法通过为startAnimatingWithImages(in:duration:repeatCount:)repeatCount 参数传递一个非零值来解决它

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

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

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

【讨论】:

以上是关于watchOS 6 WKInterfaceImage 在解除分配时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥红蜘蛛不再在真正的 Apple Watch (WatchOS 6) 上运行?

更新到 watchOS 6 后,滚动视图停止工作,有啥变化吗?

WatchOS 6.0、Swift 5.0:无背景触觉

如何在 WatchKit 扩展目标(XCode7 beta 6)中重置 watchOS 部署目标

WatchOS开发教程之五: 通知功能开发

WatchOS开发教程之五: 通知功能开发