0

わかりました、私は 12 年間コーディングを行ってきましたが、Obj-C (特にメモリ管理) の経験が比較的浅く、驚くべきエラーが発生しています。

コードブロックは次のとおりです。

    // self.contained is an NSMutableSet
    NSEnumerator *e = [self.contained objectEnumerator];
>>  while (CCNode *node = [e nextObject]) {
        if (!node.body || ![self validate:node]) {
            [self.contained removeObject:node];
        }
    }

_NSZombie_NSExceptionで示される行でスローされています>>。わかりました、これは (常に?) dealloced されたオブジェクトにアクセスしていることを意味します。私が得られないのは、この行でエラーが発生している理由です。node私が得ているものが編集されたものである場合dealloc、次の行でエラーが発生すると予想されます(たとえば、にアクセスしたときnode.body)。オブジェクト自体がどのように問題を引き起こしているのかわかりません。NSEnumeratorそれは直前に作成されたものであり、それがセットであった場合は のself.containedの行で死んでいるはずですよね?

では、nextObject取得したオブジェクト (つまり ) に対して実際にメソッドを呼び出すnodeと、例外がスローされるのでしょうか? それはおそらくそれを説明するでしょうが、私はこれが当てはまるとは思わなかったでしょう. または、ゾンビである可能性が高いオブジェクトを誰か教えてもらえますか?

これは非常に断続的に発生します。開発の最後の 1 週間程度で 2 回発生したため、ゾンビ インストゥルメントを実行してもトラップされる可能性は低いでしょう。

4

2 に答える 2

1

「コレクション プログラミング トピック」の「列挙子の使用」から:

可変コレクションの要素を列挙中に削除、置換、または追加することは安全ではありません。列挙中にコレクションを変更する必要がある場合は、コレクションのコピーを作成してそのコピーを使用して列挙するか、列挙中に必要な情報を収集して後で変更を適用することができます。

[self.contained removeObject:node];

列挙中にコレクションからオブジェクトを削除します。

于 2013-09-02T08:42:27.403 に答える