【问题标题】:iOS VoiceOver crash (message sent to deallocated instance)iOS VoiceOver 崩溃(发送到已释放实例的消息)
【发布时间】:2014-01-29 16:25:28
【问题描述】:

在启用 VoiceOver 的情况下运行我的应用时,我遇到了奇怪的崩溃。该应用程序有一个侧边栏界面(如 Facebook)。当点击侧边栏UITableViewCell 中的一个UITableViewCells 时,我换掉了视图控制器(根据点击的单元格创建一个新的并释放旧的)。

启用 VoiceOver 后,我有时在点击单元格时会崩溃。这种崩溃并非每次都会发生(大约每两次或三次尝试一次),这不是导致崩溃的唯一原因(但在我的测试中,它是触发它的主要因素)。

请记住,此崩溃在启用 VoiceOver 后发生。

当崩溃发生时,我通常会在控制台中看到这一行。

*** -[UITableTextAccessibilityElement setAccessibilityLabel:]: 消息发送到已释放实例 0x1fdaec10

但我也见过

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 4]” 请注意,我看到NSRangeException 启用了异常断点,它并没有将我指向我的代码中发生错误的位置。

所以我启用了 NSZombies 并在 Instruments 中运行该应用程序。我的任何代码都没有触及对象引用。

我也尝试在调试器之外运行时获取崩溃日志,但不幸的是 Xcode 无法对它们进行符号化。

最后一个异常回溯:

0 CoreFoundation 0x2e3c3f46 __exceptionPreprocess + 126

1 libobjc.A.dylib 0x387536aa objc_exception_throw + 34

2 CoreFoundation 0x2e2fa52e -[__NSArrayM objectAtIndex:] + 226

3 应用程序名称 0x000e3726 0x46000 + 644902

4 UIKit 0x0250462e 0x24c6000 + 255534

5 UIAccessibility 0x35c029f8 -[NSObject(AXPrivCategory)accessibilityElementCount] + 16

6 UIAccessibility 0x35bfe66a _appendChildrenToArrayStartingAtIndexWithChildren + 318

7 UIAccessibility 0x35bfe51e _appendChildrenToArrayStartingAtIndex + 86

8 UIAccessibility 0x35bfe460 _addAXElementsToArrayFromObject + 1580

9 UIAccessibility 0x35bfddfc _appendVendedAXElementsFromUIElements + 156

10 UIAccessibility 0x35bfdbfe _createAXUIElementsFromUIElements + 126

11 UIAccessibility 0x35bfc218 _copyParameterizedAttributeValueCallback + 152

12 AXRuntime 0x3152395c _AXXMIGCopyParameterizedAttributeValue + 168

13 AXRuntime 0x3152084e _XCopyParameterizedAttributeValue + 438

14 AXRuntime 0x31528158 mshMIGPerform + 184

15 核心基础 0x2e38e9da CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 30

16 核心基础 0x2e38e976 __CFRunLoopDoSource1 + 342

17 核心基础 0x2e38d14a __CFRunLoopRun + 1394

18 CoreFoundation 0x2e2f7c22 CFRunLoopRunSpecific + 518

19 核心基础 0x2e2f7a06 CFRunLoopRunInMode + 102

20 图形服务 0x32fd627e GSEventRunModal + 134

21 UIKit 0x30b9b044 UIApplicationMain + 1132

22 应用程序名称 0x000509e2 0x46000 + 43490

23 libdyld.dylib 0x38c5bab2 tlv_initializer + 2

崩溃发生在 iOS 6 和 7 上。我还尝试从整个应用程序中删除每个辅助功能调用,但应用程序仍然崩溃。

我整个星期都在试图弄清楚这一点,但我觉得我离我越来越近了。关于从这里开始的任何想法?

【问题讨论】:

  • 如果没有相关的代码可以帮助您查看

标签: ios objective-c uitableview accessibility voiceover


【解决方案1】:

我有同样的错误。我删除了可访问性方法以消除 tis 错误。 我们需要重写一些辅助方法来支持 iOS 6 中的画外音阅读顺序

- (id)accessibilityElementAtIndex:(NSInteger)index
{
    return [[self accessibleElements] objectAtIndex:index];
}

- (NSInteger)indexOfAccessibilityElement:(id)element
{
    return [[self accessibleElements] indexOfObject:element];
}

如果您的代码基于上述方法崩溃我感觉。尝试删除这些方法并检查。我观察到的一件事是删除上述方法后,Voiceover 将不会按顺序读取元素。它将以其他(随机)顺序读取。

希望这能解决您的崩溃问题。

【讨论】:

  • 谢谢,这解决了我的问题,但我不明白为什么只有 UITableViewCell/Header/Footer 需要手动处理accessibleElements相关方法。
  • 这只是我的观察:对于画外音,所有元素都应该尽早知道,它不会鼓励在中间添加元素。在 tableview 中,每当我们滚动元素时,如果这些元素来自服务器,那么画外音将更难以识别容器方法。
【解决方案2】:

我们能够通过在 iOS 6 而不是 7 上调试找到问题。

在 iOS 6 中,

AX 错误:找不到我的模拟父母,很可能我已经过时了。

显示在控制台中。结合上面提到的UITableViewCell 错误,我们挖掘了侧边栏中的所有表格代码。

我们发现我们使用可重复使用的 UITableViewCells 作为标题视图,这导致了我们看到的僵尸问题。

所以最重要的是,不要将UITableViewCells 用作UITableView 页眉/页脚视图。

【讨论】:

    【解决方案3】:

    如果您尝试手动将可访问性集中在 UITableViewCell 而不是单元格内的特定项目上,则可能会发生此崩溃。如果您的要求是将 tableCell 作为一个整体视为可访问性元素,那么除了为单元格指定可访问性标签和特征之外,请忘记不要为单元格设置 isAccessibilityElement = YES。如果isAccessibilityElement = YES 则iOS 不会尝试调用导致崩溃的[UITableTextAccessibilityElement setAccessibilityLabel:] 方法,因为它知道tableCell 本身是一个可访问性元素并且不会尝试检查单元格内的内容。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多