endBackgroundTask:导致“由于信号 9 而终止”

Posted

技术标签:

【中文标题】endBackgroundTask:导致“由于信号 9 而终止”【英文标题】:endBackgroundTask: Causing "Terminated due to signal 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 中所做的事情。 【参考方案1】:

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

【讨论】:

今天遇到了同样的问题。在 AFNetworking 回调块中在后台调用 endBackgroundTask: 时崩溃。通过在 dispatch_after 中包装对 endBackgroundTask: 的调用来修复它。

以上是关于endBackgroundTask:导致“由于信号 9 而终止”的主要内容,如果未能解决你的问题,请参考以下文章

beginBackgroundTaskWithExpirationHandler 调用 endBackgroundTask 但未结束进程

由于信号导致命令失败:分段错误:11 Xcode 8.0

在 Swift 3 中存档项目并获得“由于信号分段错误 11 导致命令失败”

Swift 编译器错误,由于信号导致命令失败:分段错误:11

退出应用程序会导致错误“来自调试器的消息:由于信号 9 而终止”

Can't endBackgroundTask:不存在标识符为 * 的后台任务,或者它可能已经结束