【问题标题】:View being released when in use due to memory warnings由于内存警告,视图在使用时被释放
【发布时间】:2010-01-08 21:08:26
【问题描述】:

我之前已经发布了几个问题,试图弄清楚为什么我会得到 EXC_BAD_ACCESS,并且我已经做了一些调试

请看这里: Help debugging iPhone app - EXC_BAD_ACCESS

和:

Overreleasing here?

所以,我认为我发现了发生了什么。

从我的日志中,我得到了这个:

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方法,但是卸载了就不行了。

【问题讨论】:

    标签: iphone memory-management uiimagepickercontroller crash-reports


    【解决方案1】:

    PictureView 是否保留在您的控制器中(我假设它是您控制器视图的子视图)?如果它没有被保留,那么你有一个悬空的参考。当您的视图控制器不在最前面,并且它收到 -didReceiveMemoryWarning 消息时,默认情况下它将释放其视图成员。如果您有指向该子视图的指针,并且它们没有被保留,那么您最终会遇到这种情况。

    首先要尝试的是覆盖 -didReceiveMemoryWarning 并调用 clearPage:

    - (void) didReceiveMemoryWarning {
        [myPictureView clearPage];
        myPictureView = nil;
        [super didReceiveMemoryWarning];
    }
    

    【讨论】:

    • 抱歉,clearPage 没有按照名称所暗示的那样做。它只是通过清除它的子视图来准备重绘视图。 PictureView 是从根视图控制器推送的视图: PictureView *picView = [[PictureView alloc] initWithNibName:@"PictureView" bundle:nil]; [self.navigationController pushViewController:picView 动画:YES]; [picView发布];我应该在这里发布吗?
    • 那么PictureView是一个ViewController?听起来你有一个悬空指针问题。检查分配的出口(而不是保留)。另外,覆盖 didReceiveMemoryWarning 并在那里中断;调用继承的,然后确保你所有的出口都是“理智”的价值。
    • 我已将 PictureView 设为插座,并在 rootviewcontroller 中将其设置为(非原子,保留)。不幸的是,这种崩溃并非每次都会发生,因此很难测试。现在让我很紧张:(
    • 如果您在 sim 上进行测试,请尝试使用菜单选项“模拟内存警告”来模拟内存警告
    • 必须看到你的代码,但你越来越近了!调用继承方式:调用超类的方法实现:[super didReceiveMemoryWarning]
    猜你喜欢
    • 2011-08-18
    • 2012-06-10
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多