【问题标题】:Memory allocation fails in the background in the ios appios应用程序后台内存分配失败
【发布时间】:2013-02-15 05:25:46
【问题描述】:

我正在尝试在本地使用的函数中创建一些无符号整数的二维数组。但是,应用程序在移至后台时会崩溃。之后我尝试了以下代码:

对于后台任务:

- (void)applicationDidEnterBackground:(UIApplication *)application
{

    if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){
        if([[UIDevice currentDevice] isMultitaskingSupported]){
            __block UIBackgroundTaskIdentifier bgTask;
            UIApplication *application = [UIApplication sharedApplication];
            bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                //[self captureImage];
                [self memCheck];
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            });
        }
    }
}

功能:

-(void) memCheck{
    size_t XY[768][1024];
    for(int i=0;i<768; ++i){
        for(int j=0;j<1024;++j){
            XY[i][j]=1;
        }
    }      
}

上面的测试代码sn-p导致app崩溃。但是,如果我尝试只分配 768*4 字节而不是 768*1024*4,它可以正常工作。

操作系统是否由于内存膨胀或任何其他原因暂停了应用程序?另外,有没有解决方法?

谢谢。

P.S:我使用过 IOSurfaces(私有 iOS API 的一部分),在后台创建和发布它们,我从未遇到过这个问题。

【问题讨论】:

    标签: ios objective-c ipad memory-management


    【解决方案1】:

    这可能不是背景问题,而是一般线程问题。通过使用dispatch_async,您可以在辅助线程中执行该块。 Apple's documentation 建议堆栈大小为 512 KB。局部变量通常分配在堆栈中。因此,一个 768*1024*4 =3.145.728 的数组超出了堆栈限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2020-05-05
      • 2018-02-05
      • 2013-05-10
      • 2016-05-01
      相关资源
      最近更新 更多