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 回答