2013-02-15 3 views
0

로컬로 사용되는 함수에 부호없는 정수의 2 차원 배열을 몇 개 만들려고합니다. 그러나 앱이 배경으로 이동할 때 충돌이 발생합니다. 배경 작업에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 * 1024 * 4가 아닌 768 * 4 바이트를 할당하려고하면 잘 작동합니다.

메모리가 부풀려 지거나 다른 이유로 OS가 응용 프로그램을 일시 중지 했습니까? 또한이 문제를 해결할 수있는 방법이 있습니까?

감사합니다.

P.S : IOSurfaces (개인 iOS API의 일부)를 사용하여 백그라운드에서 생성 및 릴리스했으며이 문제가 발생하지 않았습니다.

답변

1

아마도 이것은 배경 문제는 아니지만 일반적인 스레딩 문제 일 수 있습니다. dispatch_async을 사용하면 보조 스레드 내에서 블록을 실행합니다. Apple's documentation은 스택 크기가 512KB라고 제안합니다. 지역 변수는 일반적으로 스택에 할당됩니다. 따라서 768 * 1024 * 4 = 3.145.728의 배열이 스택 제한을 초과합니다.

+0

논리적으로 보입니다. 감사. –

관련 문제