オブジェクトのディクショナリをキーとして構築し、操作コード (追加/更新/削除など) を値として構築するコードがあります。
最近、iOS 6、または「zee Germans」の登場により、壊れました。値が構築され、場合によっては追加されますが、ほとんどの場合、(null) 値でいっぱいの辞書を取得します。
for (int i = 0; i < newArray.count; i++)
{
if (![oldArray containsObject:[newArray objectAtIndex:i]])
{
NSNumber *opNumber = [NSNumber numberWithInt:(int)kInsertOperation];
[_operationsForRows setObject:opNumber forKey:[newArray objectAtIndex:i]];
}
else ...
}
私はすでにコードを中間変数と int への列挙値の明示的なキャストで装飾しており、さらに混乱しました。結果の辞書を印刷すると、次のようになります。
{
"<Order: 0x8aad980>" = (null);
"<Order: 0x8aad7a0>" = (null);
}
ここで何が欠けているのか、誰でも説明できますか? ディクショナリは null を保持することさえできないはずですよね?
このコードは ARC の下にあります。
NSMutableDictionary はメイン スレッドで初期化されましたが、単一のセカンダリ スレッドで排他的に使用されました。
場合によっては、1 つまたは 2 つのオブジェクトが正しく追加されることがあります。10%と言います。私が試したこと:
- 辞書の初期化を使用法と同じスレッドに移動しました。うわー、オブジェクトの 90 ~ 95% は正しく追加されていますが、それでも所々に null があります。
- 可能なすべての NSNumbers をクラス フィールドに保存しました。メインスレッドで作成された辞書と数値の両方で、成功率は0%で、最初よりも低くなりました。
- クラスフィールドで現在のスレッドで初期化された辞書とメインスレッド番号を使用すると、再び90〜95%になります...
泣く、泣く... 場所全体を書き直したように見えます。