【问题标题】:-[AXSpeechAction retain]: message sent to deallocated instance 0x1c37e2b0-[AXSpeechAction 保留]:消息发送到已释放实例 0x1c37e2b0
【发布时间】:2015-08-04 22:11:14
【问题描述】:

我在 Swift 中使用AVSpeechSynthesizer() 为视障用户阅读一些方向和航向说明。

然而,一段时间后,应用程序崩溃了:

-[AXSpeechAction retain]: message sent to deallocated instance 0x1c37e2b0.

当然该类不包含在我的项目中,我什至不知道是谁创建和删除了它。

【问题讨论】:

  • 感谢指正,因为这个题目比较新,请撤掉-2评价。
  • 您是否考虑过使用UIAccessibilityAnnouncementNotification(例如参见here)?否则,假设您已经用 google 搜索并没有找到答案,如果没有更完整的代码示例,则很难提供帮助。我假设您可能正在将一个对象设置为一个弱属性,然后该属性会被释放,或者您可能正在从错误的线程调用一些 AVSpeech* 方法(参见例如 here)?
  • 实际上我在这个特定文件中没有闭包。当然,一种选择是使用 UIAccessibilityAnnouncementNotification,就像我在其他任何地方所做的那样,但在这种情况下,我会将不同口语句子之间的任何联系交给系统,就此而言,我不知道在系统运行时通知到达时会发生什么播放上一个。
  • 我的测试表明所有新消息都会被丢弃,而不是像在 AVSpeechSynthesizer 中那样排队。当然,如果我找不到更好的解决方案,我会改用那个。事实上,其他用户也可以使用这些说明,似乎不会崩溃,但这可能取决于我对任何一个用户所做的连续请求的绝对数量。
  • 您可以使用UIAccessibilityAnnouncementDidFinishNotification在您发布的公告发言结束时收到通知,这样您就知道在前一个发言结束之前不要提交另一个公告。并不是说以这种方式实现它很容易,但这是可能的。

标签: ios swift voiceover avspeechsynthesizer


【解决方案1】:

好的,我求助于 UIAccessibilityAnnouncementNotification 来处理可访问性信息,当然,其他人的转弯指示的话语问题仍然存在。这就是我表达功能的方式:

 func announcementFinished(notification:NSNotification){
        activeAnnouncement=false
    }

 func read(text:String, onlyAccessible:Bool){
     println("reading \(text)")
     if UIAccessibilityIsVoiceOverRunning() && !activeAnnouncement{
               UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification,
                text);
            activeAnnouncement=true
        }
        if (!onlyAccessible && !UIAccessibilityIsVoiceOverRunning()){
            utterance=AVSpeechUtterance(string: text)
            speechSynth.speakUtterance(utterance)
            println("alla fine dell'if")
        }
    }

【讨论】:

  • 事实上,我在 AVSpeechSynthesizer 定义中看到了这个字符串,我并没有完全掌握:/* AVSpeechUtterances 默认排队。如果 AVSpeechUtterance 已入队或正在讲话,则此方法将引发异常。 */
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2011-07-15
相关资源
最近更新 更多