在“ContainerViewControler”的 #viewDidAppear 上,发布UIAccessibilityScreenChangedNotification会导致间歇性崩溃,其中包含异常类型:EXC_CRASH(SIGABRT)。
-(void)viewDidAppear:(BOOL)animated
{
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.childController.collectionView);
}
附上了堆栈跟踪的屏幕截图。
在尝试调试时,在'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。