【问题标题】:endBackgroundTask: Causing "Terminated due to signal 9"endBackgroundTask:导致“由于信号 9 而终止”
【发布时间】:2015-10-20 05:03:27
【问题描述】:

我的应用程序同步 RSS 提要大约需要 15-30 秒,每次同步我都请求 beginBackgroundTaskWithExpirationHandler:。在 iOS 7 和 iOS 8 中,一切都运行良好。

从 iOS 9 开始,调用 [[UIApplication sharedApplication] endBackgroundTask: backgroundTask]; 会导致应用程序崩溃并显示来自调试器的消息:

由于信号 9 而终止。

根据我的研究,信号 9 意味着应用程序使用了过多的内存。当我使用仪器时,该应用永远不会超过 30mb 或 40% cpu。

我知道它来自于调用endBackgroundTask:,因为如果我不调用它,应用程序就不会崩溃。然而,一旦我调用 endBackgroundTask:应用程序每次都会崩溃。

我不确定这里出了什么问题。我什么都试过了。重写代码,移动代码,注释掉除 endBackgroundTask: 之外的所有内容。任何帮助或见解将不胜感激。

代码如下:

    @interface SyncClass ()

            @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
    @end

    -(void)startSync  
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

            [self beginBackgroundUpdateTask];
            // I then call my syncing code [syncClass sync];

        });


            //When sync is done call endBackgroundTask
            [self endBackgroundUpdateTask];
    }    

    - (void) beginBackgroundUpdateTask
    {
        NSLog(@"Background Time:%f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

        self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [self endBackgroundUpdateTask];
        }];

    }

    - (void) endBackgroundUpdateTask
    {
        [[UIApplication sharedApplication] endBackgroundTask: self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
        NSLog(@"Ending background task");
    }

【问题讨论】:

  • 你在后台线程吗?
  • 嗨,是的,同步方法是从另一个控制器调用的:dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [syncManger startSync]; });刚刚更新了问题以反映。谢谢!
  • 嗯,根据你所说的,我对终止没有很好的解释。可能是sync 代码中的东西,你没有显示的代码? that 可能是什么占用了太多内存?这可能是有道理的,因为当您调用 endBackgroundTask 时,运行时会暂停您并发现您在后台使用了太多内存(在此之前,您无法终止,因为您仍在运行)。总的来说,我建议您认真对待这条信息:您应该已经在尝试释放资源以减少进入后台时的内存使用量。
  • 这也是我的想法。但是,在运行分配工具后,我的持久字节为 11.25 MB,但总字节为 352.92MB,它仍然崩溃。据我了解,我需要担心的是持久字节。每次我运行分配工具时,应用程序在小于 20 MB 的持久字节时崩溃。谢谢,
  • 好吧,尝试不同的方式。如果您确实调用endBackgroundTask:beginend之间调用sync会发生什么?那你会被终止吗?如果不是,在我看来,这证明你被解雇是因为你在sync 中所做的事情。

标签: ios xcode ios9


【解决方案1】:

在这里回答我自己的问题。 AFNetworking 和 FMDB 恰好过时了。通过可可豆荚更新它们似乎已经解决了这个问题。

【讨论】:

  • 今天遇到了同样的问题。在 AFNetworking 回调块中在后台调用 endBackgroundTask: 时崩溃。通过在 dispatch_after 中包装对 endBackgroundTask: 的调用来修复它。
猜你喜欢
  • 2017-09-19
  • 2021-03-31
  • 1970-01-01
  • 2017-07-08
  • 2018-04-19
  • 2018-02-25
  • 2016-09-17
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多