7

を含むクラスがあります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 はいつでも/どのようにでも自動解放を実行できることがわかりました。

4

2 に答える 2

2

だろう

NSSet* collectibleCopy = [NSSet setWithSet:_collectibles] 

あなたのために働きますか?

于 2013-05-24T14:21:38.067 に答える