将可访问性通知发布到子视图控制器的视图时发生崩溃

时间:2014-09-05 13:25:38

标签: objective-c accessibility uiaccessibility childviewcontroller

在“ContainerViewControler”的 #viewDidAppear 上,发布UIAccessibilityScreenChangedNotification会导致间歇性崩溃,其中包含异常类型:EXC_CRASH(SIGABRT)。

-(void)viewDidAppear:(BOOL)animated
{
    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.childController.collectionView);
}

附上了堆栈跟踪的屏幕截图。

Exception stack trace

在尝试调试时,在'objc_exception_throw'帧上,确实在$ r0处获得了异常

  

(lldb)po $ r0   *** - [__ NSArrayM objectAtIndex:]:索引0超出空数组的边界

在框架'_UIAXBroadcastMainThread'上,在$ r8的集合视图中获取了一个单元格

(lldb) po $r8
<UICollectionViewCell: 0x15711ae0; baseClass = UICollectionViewCell; frame = (0 0; 320 278); opaque  = NO; gestureRecognizers = <NSArray: 0x15709f90>; layer = <CALayer: 0x157119b0>>

在出现 childController 上的 collectionView 和可访问性通知传递之间存在时间问题的印象,但是无法编写测试为了它。

要求更好地理解UIAccessibility期望NSArray持有什么以及导致索引超出范围的原因。

那是在 iOS 7
iPhone 4,iPhone 5

修改
由于崩溃是间歇性的,因此调整#objectAtIndex:方法来查看数组预期会保留的内容。

@implementation NSMutableArray (Debug)

- (id)myObjectAtIndex:(NSUInteger)index
{

    return [self myObjectAtIndex:index];
}

+ (void)load {
    NSLog(@"Swizzling method ...");

    Class arrayClass = NSClassFromString(@"__NSArrayM");
    Method originalMethod = class_getInstanceMethod(arrayClass, @selector(objectAtIndex:));
    Method categoryMethod = class_getInstanceMethod(arrayClass, @selector(myObjectAtIndex:));
    method_exchangeImplementations(originalMethod, categoryMethod);
}

@end

看起来该数组包含所有UIView实例,这些实例是 collectionView 的UICollectionViewCell的子视图,通知已发布并启用了“辅助功能”。

不确定UIAccessibility如何填充该数组。

想知道它是否假定大小等于启用了“辅助功能”的每个UIView,但是根据某些条件填充数组,这些条件取决于这些UIView的状态,作为从一个视图控制器导航到另一个视图控制器的一部分和UIAccessibilityScreenChangedNotification。

0 个答案:

没有答案