スレッドセーフに問題がありました。コンテンツを変更するとスレッド間でエラーが発生するキューがあります。以前はロックを使用したことがありませんでしたが、試してみました。キューのバッキング NSMutableArray を操作するすべてのコードにロックを追加しました。問題は、私がそれらすべてに同じロックを使用しなかったことだと思います。配列を変更した各メソッドで NSLock の新しいインスタンスを作成しました。アレイを保護するには、1 つの NSLock ivar を使用する必要があると想定しています。しかし、私の混乱は、一度追加すると機能したという事実から来ています。以下はサンプルです。新しい NSLock を作成したすべての場所で、ivar NSLock を 1 つだけ使用する必要があったと思います。このコードは、デキューに対するエンキューではなく、他のエンキューに対するエンキューと他のデキューに対するデキューをロックしただけだと思います。明確化は素晴らしいでしょう。
@implmentation
...
- (void)enqueue:(id)obj
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
[_backingStore addObject:obj];
[arrayLock unlock];
}
- (id)dequeue
{
NSLock *arrayLock = [[NSLock alloc] init];
[arrayLock lock];
id result = [_backingStore firstObject];
if( result )
{
[_backingStore removeObjectAtIndex:0];
}
[arrayLock unlock];
return result;
}
...
@end