1

我得到-[__NSOrderedSetM removeObjectAtIndex:]: index 0 beyond bounds for empty ordered set了以下代码:

- (void)moveAdapter:(SUBaseAdapter *)adapter
               from:(NSMutableOrderedSet *)src
                 to:(NSMutableOrderedSet *)trg {

    SS_ASSERT(adapter);
    SS_ASSERT(src);
    SS_ASSERT(trg);

    dispatch_barrier_sync(self.adaptersQueue, ^{ // CONCURRENT QUEUE

        if (![src containsObject:adapter]) {
            NSString *message = [NSString stringWithFormat:@"moveAdapter: %@ not in src", adapter.providerName];
            [[SULoggerManager sharedInstance] log:message level:SU_LOG_INTERNAL tag:TAG_INTERNAL];
            return;
        }
        if ([trg containsObject:adapter]) {
            NSString *message = [NSString stringWithFormat:@"moveAdapter: %@ already in trg", adapter.providerName];
            [[SULoggerManager sharedInstance] log:message level:SU_LOG_INTERNAL tag:TAG_INTERNAL];
            return;
        }

        [trg addObject:adapter];
        [trg sortUsingDescriptors:@[self.sortDescriptor]];
        [src removeObject:adapter]; //CRASH HERE

    });

}

所以,我没有明确地打电话removeObjectAtIndex:,但也许removeObject:adapter会?

这是我不明白的:

  1. 我尝试添加anObject到一组,然后调用removedObject:anObject了两次,没有问题。
  2. 我认为这可能是一个并发问题,两个不同removeObject的线程进入认为它位于位置 1,然后第二个线程失败,但我正在使用dispatch_barrier_sync,并且我不会从其他任何地方的“src”中删除对象。

有什么提示吗?

4

0 回答 0