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 后,滚动视图停止工作,有啥变化吗?