0

テーブルビューがあるiPadアプリで作業しています。ユーザーがテーブルの行を選択するとdidSelectRowAtIndexPath、ポップオーバーが開きます。特定のボタンを使用しようとすると、「割り当て解除されたインスタンスにメッセージが送信されました」というエラー メッセージが表示されます。私は元々、ポップオーバーによってエラーがスローされていたのですが(それviewDidLoadか何かで)、ブレークポイントを入れてコードをステップ実行しました。驚いたことに、ポップオーバーとdidSelectRowAtIndexPathテーブル ビューの残りの部分の読み込みを完了することができました (実際には、いくつかの if ブロックからステップ アウトするだけです)。次に、どのクラス ファイルにも表示されない自動生成されたコードに数ステップ入ると、エラーがスローされます (次のようになります0x0010d71d <+1164> mov 0x6...)。

だから、私の質問は、このエラーがスローされている場所を見つけるにはどうすればよいですか? didSelectRowAtIndexPathどこかで台無しになる可能性がある後に自動的に実行される別の方法はありますか?

4

2 に答える 2

1

DEBUG ビルドで NSZombieEnabled を有効にして ( Xcode 4 で NSZombieEnabled を設定するにはどうすればよいですか? を参照してください)、割り当て解除/解放された、アクセスしているオブジェクトのインスタンスを見つけます。

また、プロジェクトを ARC にアップグレードすることを検討してください。これにより、このようなメモリ管理の問題が解決される可能性があります。

于 2012-09-12T18:33:38.403 に答える
0

さて、みんなの反応からmalloc error -[CFString release]を見つけることができました。これにより、ポップオーバーに割り当てた文字列があることがわかりましviewDidLoad

myString = [NSMutableString stringWithString:[myGlobalFunctionClass getMyString]];

このように割り当てているため、autorelease に設定されます。問題は、私が明示的[myString release];に参加しmyString = nil;ていたことviewWillAppearです。と のパーツを削除するreleaseと、エラーが解消されました。=nil

私が投稿した実際の質問に答えるためにautorelease、シミュレーターが実際にポップオーバーを表示しようとするまで (これは の後に実行されますdidSelectRowAtIndexPath)、 は起動しなかったと思います。それは私が で明示的に実行した後に発生するため、[myString release]もはや存在しない何かをviewWillAppear試みていました。autorelease繰り返しますが、それを行う適切な方法は、コードのどこにもautoreleaseなく、最後に置くことでした。[myString release]

誰かがこれが正しいことを確認できますか? コメントで述べたように、私はまだ iOS 開発に非常に慣れていません。このプロジェクトの終わりには、最初に行った作業に戻り、より効率的に、ベスト プラクティスに従って作業を行うという点で、何十もの改善を行うことができるようになると感じています。

于 2012-09-12T20:51:26.820 に答える