【发布时间】: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中所做的事情。