iOS crash上报和分析

iOS常见bug - 崩溃/卡顿(crash/statter)

2017-07-31  本文已影响305人  wustzhy
$ 朋友们 hello , 欢迎来到常见bug, 新的一页开始了,项目需求终于平衡于开发速度和bug处理, 还可以闲来记录一下下了~ 👉Now �begin ....
    试问各类bug谁最泛滥, 那得莫过于"数组越界"了。好可恶是吧,那就严惩之~
    试问各类卡顿总归于一因数 , 思考.........        一个解释 -->  耗时工作放在了主线程咯~

(一) crash列举一二

(1).数组

image.png

需要避免,👇

if (self.currentIdx >= _getAccostArr.count) {
    return;
}

or

 if (_getAccostArr.count == 0 || self.currentIdx > _getAccostArr.count - 1) {
    return;
 }
// 特别注意 , 在点击删除最后一个卡片时, 卡片有消失的动画时, 你连续点击删除,要小心。
// 坑 :  删除最后一个元素时, 伴随着卡片动画,动画消失 结束时 你才改变 currentIndex , 但是在此期间,操作过快的用户 连续点击了好几次, 那么 currentIndex 就越界了...

(2).ios版本适配

特别注意: 方正牛盲碰瓷 (尽量别使用方正字体, 可能导致赔钱、app下架等风险)

(3).字典

然后对字典操作会报错
__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]

(3).线程

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
      dispatch_async(dispatch_queue_create("Socket message queue", NULL), ^{ // do sth};
}

解决方式: semaphore自己手动处理, NSOperation, QSDispatchQueue(内部semaphore处理), 可设最大并发数, 否则直接上面那么用会导致无限制的创建子线程(最高60多个吧), 最终甚至抢占主线程资源, 导致卡死or崩溃~ . 解决👉GitHub Demo 参考如下


- (void)test_GCD_semaphore_WithMaxTheadCount:(NSInteger) max {
    
    dispatch_queue_t workConcurrentQueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t serialQueue = dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(max);    // create semaphore: value = 3

    NSLog(@"begin: %@",[NSThread currentThread]);
    for (int i = 0; i < 10; i++) {
        __block int index = i;
        dispatch_async(serialQueue, ^{
            
            // If value < 0, then wait here. Else value > 0, then pass, and value -1
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            dispatch_async(workConcurrentQueue, ^{
                
                sleep(1);
                NSLog(@"执行第%zd次操作,线程:%@",index, [NSThread currentThread]);
                dispatch_semaphore_signal(semaphore);});                // Perform value +1
        });
    }
    NSLog(@"主线程...!");
// max  :   2               10
// begin:   03:02:45.309    03:05:53.301
// end  :   03:02:50.332    03:05:54.309
// time :    ≈ 5.03s           ≈ 1s
}


(二) statter列举一二
在ios应用中,所有的UI操作及更新都是在主线程完成,并且主线程的runloop是逐个处理用户事件的(当然其他的runloop也一样),
所以主线程必须等待上一次事件处理完成后才能继续响应下一次事件。

以上statter解释from👉开发iOS应用如何避免卡顿


待续~

线程管理👉github Demo

上一篇 下一篇

猜你喜欢

热点阅读