4

私が現在取り組んでいるコードでは、NSNumberオブジェクトを配列に追加する必要があります。値が0〜12のすべてのNSNumberは正常に追加されますが、13以降ではEXC_BAD_ACCESSが発生します。NSZombieEnabledをオンにして、現在取得して*** -[CFNumber retain]: message sent to deallocated instance 0x3c78420います。

コールスタックは次のとおりです。
#0 0x01eac3a7 in ___forwarding___
#1 0x01e886c2 in __forwarding_prep_0___
#2 0x01e3f988 in CFRetain
#3 0x01e4b586 in _CFArrayReplaceValues
#4 0x0002a2f9 in -[NSCFArray insertObject:atIndex:]
#5 0x0002a274 in -[NSCFArray addObject:]
#6 0x00010a3b in -[Faves addObject:] at Faves.m:24
#7 0x000062ff in -[ShowController processFave] at ShowController.m:458
#8 0x002af405 in -[UIApplication sendAction:to:from:forEvent:]
#9 0x00312b4e in -[UIControl sendAction:to:forEvent:]
#10 0x00314d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#11 0x00313abb in -[UIControl touchesEnded:withEvent:]
#12 0x002c8ddf in -[UIWindow _sendTouchesForEvent:]
#13 0x002b27c8 in -[UIApplication sendEvent:]
#14 0x002b9061 in _UIApplicationHandleEvent
#15 0x02566d59 in PurpleEventCallback
#16 0x01e83b80 in CFRunLoopRunSpecific
#17 0x01e82c48 in CFRunLoopRunInMode
#18 0x02565615 in GSEventRunModal
#19 0x025656da in GSEventRun
#20 0x002b9faf in UIApplicationMain
#21 0x00002498 in main at main.m:14

特定の範囲のNSNumbersに分離されていなかった場合、メモリ管理で何かを台無しにしたと思いますが、まったくわかりません。

何か案は?

ありがとう、
ジョシュ

4

2 に答える 2

11

ここで別の質問に答えたときに発見したように、0から12までの数字は特別です。これは実装の詳細であり、言語仕様ではないことに注意してください。

基本的に、12までの(およびそれを含む)数値は、既存のNSNumberへの参照を提供します。これは、不変であるという事実のために可能です。調査によると、13以上の数字は別のインスタンスを与えました。

したがって、おそらくメモリ管理台無しにしてしまったでしょう:-) 13未満の数値が、そのような場合にベーコンを節約している既存の数値への参照である可能性が高いという事実だけです。その特定の問題を追跡できるように、さらにコードを投稿することをお勧めします。


そして、ここで別の答えへのあなたのコメントに基づいて:

コードに保持行を追加しましたが、すべてが完全に機能するようになりました。理由はわかりません。私はそれで転がるつもりです。ありがとう!

13未満のNSNumberは、自分で取得する前にすでに1の保持カウントを持っている(カウントを2に上げる)という事実が、EXC_BAD_ACCESSを引き起こしていない理由であることがわかると思います。明らかに、あなたのコードはあなたが割り当てたすべての番号を失っていますが、それらはまだ使用されているので、システムは13未満の番号を解放していません(1以上のカウントを保持します)。

于 2010-03-28T15:37:46.713 に答える
2

明らかに、NSNumbers>12は保持されます。これを証明する非常に小さなプログラムを作成することをお勧めします。次に、そのプログラムを取得して関数にし、プログラムの早い段階で呼び出します。エラーが表示されるまで、関数をプログラムの後半のポイントにゆっくりと移動します。したがって、あなたはあなたの本当のバグを見つけるでしょう。

于 2010-03-28T15:13:44.017 に答える