Ios 添加操作崩溃

Ios 添加操作崩溃,ios,crash,pthreads,nsoperation,nsoperationqueue,Ios,Crash,Pthreads,Nsoperation,Nsoperationqueue,设置:在我的应用程序中,我有一张带有大量注释的地图。这些注释以集群形式显示,其中数据从服务器加载 要创建集群,使用具有以下属性的NSOperationQueue查询注释数据库: qualityOfService = NSQualityOfServiceUtility; maxConcurrentOperationCount = 1; 要添加操作,请执行以下操作: - (void)updateAfterServerReturns { [_q cancelAllOperations];

设置:在我的应用程序中,我有一张带有大量注释的地图。这些注释以集群形式显示,其中数据从服务器加载

要创建集群,使用具有以下属性的
NSOperationQueue
查询注释数据库:

qualityOfService = NSQualityOfServiceUtility;
maxConcurrentOperationCount = 1;
要添加操作,请执行以下操作:

- (void)updateAfterServerReturns {
    [_q cancelAllOperations];

    NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock: ^{
        __weak typeof(self) weakSelf = self;
       [weakSelf myOperation]
    }];

    if(operation) {
        @autoreleasepool {
        [_q addOperation:operation];
        }
    }
}
- (void)myOperation {
   //retrieve data, then update map
   __weak typeof(self) weakSelf = self;  
  [weakSelf updateMap];
}

- (void)updateMap {
    __weak typeof(self) weakSelf = self;
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
  //update
   }];
}
问题:当用户四处移动,服务器返回信息时,我从com.apple.main thread(thread 1)中得到以下崩溃
,它会猛烈地停止一切。车祸并非每次都会发生,但往往是不可接受的

有人有什么建议吗?谢谢

碰撞详细信息

在日志中:

2015-12-06 23:34:31.215 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x184450f48 0x199003f80 0x18433a754 0x100224af8 0x100119c18 0x100119ca4 0x100119c84 0x100119cd0 0x100119c64 0x100119cd0 0x100119ca4 0x100119cd0 0x100119c64 0x100119c84 0x100223b9c 0x1003d50c0 0x185378374 0x1852cb1a0 0x1852bb3e8 0x18537a768 0x100e2dc68 0x100e3a780 0x100e31958 0x100e3c898 0x100e3c590 0x199a35470 0x199a35020)
libc++abi.dylib: terminating with uncaught exception of type NSException
(Recorded Frame) 
在发生崩溃的线程中逐步执行以下操作:

libsystem_kernel.dylib`__pthread_kill:
0x19996f138 <+0>:  movz   x16, #0x148
0x19996f13c <+4>:  svc    #0x80
->  0x19996f140 <+8>:  b.lo   0x19996f158               ; <+32>
 0x19996f144 <+12>: stp    x29, x30, [sp, #-16]!
    0x19996f148 <+16>: mov    x29, sp
    0x19996f14c <+20>: bl     0x199956140               ; cerror_nocancel
    0x19996f150 <+24>: mov    sp, x29
    0x19996f154 <+28>: ldp    x29, x30, [sp], #16
    0x19996f158 <+32>: ret    

libdispatch.dylib`_dispatch_call_block_and_release:
    0x100e2dc90 <+0>:  stp    x20, x19, [sp, #-32]!
    0x100e2dc94 <+4>:  stp    x29, x30, [sp, #16]
    0x100e2dc98 <+8>:  add    x29, sp, #16
    0x100e2dc9c <+12>: mov    x19, x0
    0x100e2dca0 <+16>: ldr    x8, [x19, #16]
    0x100e2dca4 <+20>: blr    x8
->  0x100e2dca8 <+24>: mov    x0, x19
    0x100e2dcac <+28>: ldp    x29, x30, [sp, #16]
    0x100e2dcb0 <+32>: ldp    x20, x19, [sp], #32
    0x100e2dcb4 <+36>: b      0x100e59fec               ; symbol stub for: _Block_release
libsystem\u kernel.dylib`\u pthread\u kill:
0x19996f138:movz x16,#0x148
0x19996f13c:svc#0x80
->0x19996f140:b.lo 0x19996f158;
0x19996f144:stp x29,x30,[sp,#-16]!
0x19996f148:mov x29,sp
0x19996f14c:bl 0x199956140;塞罗鲁诺坎塞尔
0x19996f150:mov sp,x29
0x19996f154:ldp x29,x30,[sp],#16
0x19996f158:ret
libdispatch.dylib`\u dispatch\u call\u block\u和\u release:
0x100e2dc90:stpx20,x19,[sp,#-32]!
0x100e2dc94:stp x29,x30[sp,#16]
0x100e2dc98:添加x29,sp,#16
0x100e2dc9c:mov x19,x0
0x100e2dca0:LDRx8[x19,#16]
0x100e2dca4:blr x8
->0x100e2dca8:mov x0,x19
0x100e2dcac:ldp x29,x30,[sp,#16]
0x100e2dcb0:ldpx20,x19,[sp],#32
0x100e2dcb4:b 0x100e59fec;符号存根:\块\发布
更多详情:

Foundation`__NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__:
    0x185378364 <+0>:  stp    x29, x30, [sp, #-16]!
    0x185378368 <+4>:  mov    x29, sp
    0x18537836c <+8>:  ldr    x8, [x0, #16]
    0x185378370 <+12>: blr    x8
->  0x185378374 <+16>: ldp    x29, x30, [sp], #16
    0x185378378 <+20>: ret  
Foundation`\uuu NSBLOCKOPERATION\u正在调用\u OUT\u到\u A\u BLOCK\uu:
0x185378364:stp x29,x30,[sp,#-16]!
0x185378368:mov x29,sp
0x18537836c:ldr x8[x0,#16]
0x185378370:blr x8
->0x185378374:ldp x29,x30,[sp],#16
0x185378378:ret

首先确保在将任何对象插入数组之前初始化该数组

例如,如果我们讨论的是NSMutableArray,那么

NSMutableArray *arr = [[NSMutableArray alloc] init];
其次,确保没有插入nil值;在插入之前,请创建一个条件:

if(object) {
    // Insert to array
} else { 
    // Don't insert and investigate why it returns nil if needed
}
通过这样做,您将很可能摆脱崩溃

但是,如果仍在复制,我建议使用异常断点对其进行调试,并找到问题的具体来源,请按照此链接了解如何执行此操作:

您需要提供有关坠机的详细信息。完整的错误消息是什么?哪一行代码导致了崩溃?@rmaddy这是个问题,我不太确定。在返回服务器调用和添加新操作之间似乎存在某种竞争条件。你能告诉我应该去哪里提供更多有用的信息吗?碰撞日志应该是合适的地方。或者,如果您在使用调试器时遇到崩溃,控制台将出现错误,并且堆栈跟踪将显示在调试器中。好的,我正在尽最大努力快速复制now@rmaddy我用一些细节更新了问题,请告知是否有其他信息需要我提供/注意。