iOS: необъяснимо -[__NSOrderedSetM removeObjectAtIndex:]: индекс 0 вне границ для пустого упорядоченного набора

Я получил -[__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' где-либо еще.

Есть намеки?

0 ответов

Другие вопросы по тегам