0

ローカルで使用される関数で、符号なし整数の2次元配列をいくつか作成しようとしています。ただし、アプリがバックグラウンドに移動するとクラッシュします。その後、次のコードを試しました。

バックグラウンドタスクの場合:

- (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;
        }
    }      
}

上記のテストコードスニペットにより、アプリがクラッシュします。しかし、768 * 1024*4ではなく768*4バイトだけを割り当てようとすると、正常に機能します。

メモリの肥大化やその他の理由でOSがアプリを一時停止しているのでしょうか。また、これに対する回避策はありますか?

ありがとう。

PS:私はIOSurfaces(プライベートiOS APIの一部)を使用し、バックグラウンドでそれらを作成してリリースしましたが、この問題は発生しませんでした。

4

1 に答える 1

1

おそらく、これはバックグラウンドの問題ではなく、一般的なスレッドの問題です。を使用しdispatch_asyncて、セカンダリ スレッド内でブロックを実行します。Apple のドキュメントによると、スタック サイズは 512 KB です。ローカル変数は通常、スタックに割り当てられます。したがって、768*1024*4 =3.145.728 の配列はスタック制限を超えます。

于 2013-02-15T06:32:17.887 に答える