0

EXC_BAD_ACCESS が発生する理由を突き止めようとして、以前にいくつかの質問を投稿しました。また、少しデバッグを行いました。

ここを参照してください: iPhone アプリのデバッグのヘルプ - EXC_BAD_ACCESS

と:

ここで過剰放出?

それで、何が起こっているのかを発見したと思います。

私のログから、私はこれを得ています:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000f
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x00003ebc objc_msgSend + 20
1   MyApp                       0x0000378a -[PictureView clearPage] (PictureView.m:79)

最初は、「clearPage」関数内で解放されたオブジェクトがメッセージを送信されていることが問題だと思っていましたが、友人と話しているうちに、PictureView オブジェクト自体が既に解放されている可能性があると信じるようになりました。

これは私のログ出力によって確認されます:

Fri Jan  8 20:28:32 unknown MyApp[2224] <Warning>: Picture View Unloaded
Fri Jan  8 20:28:32 unknown  MyApp[2224] <Warning>: Memory warning from Picture view
Fri Jan  8 20:28:34 unknown  MyApp[2224] <Warning>: Scaling image
Fri Jan  8 20:28:36 unknown  MyApp[2224] <Warning>: Attempting to save image to disk
Fri Jan  8 20:28:37 unknown  MyApp[2224] <Warning>: Saved file to: /var/mobile/Applications/065C0D37-95C1-41D4-98F0-16A3555682CD/Documents/MyImage1.jpg
Fri Jan  8 20:28:37 unknown  MyApp[2224] <Warning>: Clearing page
Fri Jan  8 20:28:40 unknown ReportCrash[2225] <Notice>: Formulating crash report for process  MyApp[2224]
Fri Jan  8 20:28:41 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.yourcompany.MyApp[0xb8e1]) Job appears to have crashed: Bus error

だから、私が使用しているビューは、イメージピッカーによって引き起こされたメモリ警告を受け取った後、アンロードされていると思います...

そして私の質問は、どうすればこれが起こらないようにできますか? PictureView の clearPage メソッドを呼び出す必要があることは明らかですが、アンロードされている場合はできません。

4

1 に答える 1

3

PictureView はコントローラーに保持されていますか (コントローラーのビューのサブビューであると想定しています)。保持されていない場合は、ぶら下がっている参照があります。ビュー コントローラーが最前面になく、-didReceiveMemoryWarning メッセージを受け取ると、デフォルトでそのビュー メンバーを解放します。そのサブビューへのポインターがあり、それらが保持されていない場合、この状況に陥ります。

最初に試すことは、-didReceiveMemoryWarning をオーバーライドして clearPage を呼び出すことです。

- (void) didReceiveMemoryWarning {
    [myPictureView clearPage];
    myPictureView = nil;
    [super didReceiveMemoryWarning];
}
于 2010-01-08T21:12:53.787 に答える