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:
但不在begin
和end
之间调用sync
会发生什么?那你会被终止吗?如果不是,在我看来,这证明你被解雇是因为你在sync
中所做的事情。
【参考方案1】:
在这里回答我自己的问题。 AFNetworking 和 FMDB 恰好过时了。通过可可豆荚更新它们似乎已经解决了这个问题。
【讨论】:
今天遇到了同样的问题。在 AFNetworking 回调块中在后台调用endBackgroundTask:
时崩溃。通过在 dispatch_after 中包装对 endBackgroundTask:
的调用来修复它。以上是关于endBackgroundTask:导致“由于信号 9 而终止”的主要内容,如果未能解决你的问题,请参考以下文章
beginBackgroundTaskWithExpirationHandler 调用 endBackgroundTask 但未结束进程
在 Swift 3 中存档项目并获得“由于信号分段错误 11 导致命令失败”
Swift 编译器错误,由于信号导致命令失败:分段错误:11