iOS VoiceOver崩溃(发送到解除分配的实例的消息)

时间:2014-01-29 16:25:28

标签: ios objective-c uitableview accessibility voiceover

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

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

请注意,此次崩溃仅发生 ,然后启用VoiceOver。

发生崩溃时,我通常会在控制台中获取此行。

  

*** - [UITableTextAccessibilityElement setAccessibilityLabel:]:发送到解除分配的实例0x1fdaec10的消息

但我也见过

  

*由于未捕获的异常'NSRangeException'终止应用程序,原因:'* - [__ NSArrayM objectAtIndex:]:索引6超出边界[0 .. 4]'   注意我看到启用了异常断点的NSRangeException,它没有指向我的代码中发生错误的位置。

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

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

  

Last Exception Backtrace:

     

0 CoreFoundation 0x2e3c3f46 __exceptionPreprocess + 126

     

1 libobjc.A.dylib 0x387536aa objc_exception_throw + 34

     

2 CoreFoundation 0x2e2fa52e - [__ NSArrayM objectAtIndex:] + 226

     

3 APP-NAME 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 CoreFoundation 0x2e38e9da CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 30

     

16 CoreFoundation 0x2e38e976 __CFRunLoopDoSource1 + 342

     

17 CoreFoundation 0x2e38d14a __CFRunLoopRun + 1394

     

18 CoreFoundation 0x2e2f7c22 CFRunLoopRunSpecific + 518

     

19 CoreFoundation 0x2e2f7a06 CFRunLoopRunInMode + 102

     

20 GraphicsServices 0x32fd627e GSEventRunModal + 134

     

21 UIKit 0x30b9b044 UIApplicationMain + 1132

     

22 APP-NAME 0x000509e2 0x46000 + 43490

     

23 libdyld.dylib 0x38c5bab2 tlv_initializer + 2

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

我一直试图弄清楚这一周,并且不觉得我越来越近了。关于从哪里开始的任何想法?

3 个答案:

答案 0 :(得分:4)

我有同样的错误。我删除了辅助功能方法以摆脱tis错误。 我们需要覆盖一些辅助功能方法,以支持iOS 6中画外音的阅读顺序

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

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

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

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

答案 1 :(得分:3)

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

在iOS 6中,

  

AX错误:找不到我的模拟父母,很可能是陈旧的。

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

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

所以底线,不要将UITableViewCells用作UITableView页眉/页脚视图。

答案 2 :(得分:1)

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