xcode 獲取的崩潰日志中有一篇日志信息如下
image.png
查看代碼videoDrawViewWillHide方法中時(shí)一個(gè)數(shù)組遍歷的方法,查詢相關(guān)資料后差不多可以確定是在遍歷數(shù)組的過程中修改或者刪除了數(shù)組的元素導(dǎo)致, 編寫demo 重現(xiàn)問題
removeArr = [[NSMutableArray alloc] initWithCapacity:1];
for (int i = 0; i < 100; i++) {
[removeArr addObject:[NSString stringWithFormat:@"%d", I]];
}
dispatch_async(dispatch_queue_create("ergodicArr", DISPATCH_QUEUE_SERIAL), ^{
[self ergodicArr];
});
dispatch_async(dispatch_queue_create("removaArr", DISPATCH_QUEUE_SERIAL), ^{
[self removeArry];
});
-(void)removeArry{
for (int i = 20; i < 30; i++) {
[self->removeArr removeObject:[NSString stringWithFormat:@"%d",I]];
}
NSLog(@"removearr = %@", self->removeArr);
}
-(void)ergodicArr
{
for (NSString *obj in removeArr) {
[NSThread sleepForTimeInterval:0.1];
NSLog(@"obj = %@", obj);
}
}
編譯運(yùn)行結(jié)果如下
image.png
得到了與崩潰日志中相同的結(jié)果
解決方案:修改遍歷方法
dispatch_async(dispatch_queue_create("ergodicArr", DISPATCH_QUEUE_SERIAL), ^{
[self ergodicArr1];
});
-(void)ergodicArr1
{
[removeArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[NSThread sleepForTimeInterval:0.1];
NSLog(@"obj = %@", obj);
}];
}
編譯運(yùn)行 正常