2013-02-15 43 views
0

我想在本地使用的函數中創建一些無符號整數的二維數組。但是,該應用在移至背景時會崩潰。我嘗試了之後,下面的代碼:內存分配在ios應用程序中的背景失敗

對於後臺任務:

- (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 * 4字節而不是768 * 1024 * 4,它工作正常。

由於內存膨脹或其他原因,操作系統是否暫停應用程序?另外,有沒有解決這個問題的方法?

謝謝。 P:我已經使用IOSurfaces(私有iOS API的一部分),在後臺創建並釋放它們,我從未遇到過這個問題。

回答

1

也許,這不是一個背景問題,而是一個普遍的線程問題。通過使用dispatch_async您可以在輔助線程內執行該塊。 Apple's documentation表明堆棧大小爲512 KB。局部變量通常被分配一個堆棧。因此,768 * 1024 * 4 = 3.145.728的數組超出了堆棧限制。

+0

似乎合乎邏輯。謝謝。 – 2013-02-15 06:51:08