を含むクラスがありますNSSet
。そのオブジェクトは と呼ば_collectibles
れ、メソッドで、次のような処理を行うためにそのセットのコピーを作成します。
NSSet* collectibleCopy = [_collectibles copy];
実際には、これが次のメッセージで定期的にクラッシュするのを確認します。
[__NSPlaceholderSet initWithObjects:count:]: attempt to insert nil object from objects
上記のコードを次のように変更することで問題を解決しました。
NSMutableSet* collectibleCopy = [[NSMutableSet alloc] initWithCapacity: [_collectibles count]];
for ( id thing in _collectibles ) {
[collectibleCopy addObject: thing];
}
そして今、そのようなクラッシュを再現できなくなりました。私は[copy]
きっともっと効率的で、むしろそれを使いたいのですが、なぜそれが完全に不安定なのかわかりません!
更新:完全なコンテキストには大量の説明が必要ですが、これを解決するための鍵は、コードが次のように呼び出されたことです。
NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock: ^{
[thing doStuff];
}];
[operationQueue addOperation: operation];
そして、私は、基本的に多くのことを遅くすることで、次のように初期化されたキューに対して 2 つのスレッドを実行する 2 つのスレッドでアプリをキャッチしました。
operationQueue.maxConcurrentOperationCount = 1;
私は不可能だと思っていました。手がかりは、2 番目のスレッドが [NSAutoreleasePool ドレイン] にあったことでした。これにより、NSOperationQueue はいつでも/どのようにでも自動解放を実行できることがわかりました。