2013-03-07 2 views
0

디바이스 카메라의 픽셀 데이터를 저장하고 픽셀을 이전 비디오 프레임과 비교해야하는 어플리케이션을 작성 중입니다. 여기 iOS - 메모리 수신 경고, 모든 Malloc이 해제 됨

나에게 문제를 제공하는 방법입니다 :

-(UIImage *)detectMotion:(CGImageRef)imageRef 
{ 
    UIImage *newImage = nil; 

    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent,  bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

    // this is the problem loop 
    for(int i = 0; i < width * height * 4; i += 4) { 

     int gray = 0.216 * rawData[i] + 0.715 * rawData[i + 1] + 0.0722 * rawData[i + 2]; 

     rawData[i] = gray; 
     rawData[i + 1] = gray; 
     rawData[i + 2] = gray; 
     rawData[i + 3] = 255; 

     int grayDelta = abs(gray - prevFrameRawData[i/4]); 

     int newColor = 0; 
     if (sqrt(grayDelta * grayDelta * 2) >= 60) { 
      newColor = 255; 
     } 

     rawData[i] = newColor; 
     rawData[i + 1] = newColor; 
     rawData[i + 2] = newColor; 
     rawData[i + 3] = 255; 

     prevFrameRawData[i/4] = gray; 
    } 

    CGImageRef newCGImage = CGBitmapContextCreateImage(context); 
    newImage = [UIImage imageWithCGImage:newCGImage]; 
    CGImageRelease(newCGImage); 

    CGContextRelease(context); 

    free(rawData); 
} 

참고 : prevFrameRawData는 다음의 dealloc 메소드에서 해제 클래스 'init 메소드에 malloc이된다.

일부 테스트를 한 후에 메모리 블록에 값을 할당하지 않으면 경고 메시지가 표시되지 않는다는 것을 알았습니다.

난 당신이

rawData[i] = value 

같은 값을 할당 할 때 그냥 메모리에 그 자리를 덮어 씁니다 생각했다.

이 모든 저급 수준의 것들은 모두 저에게 새로운 것입니다. 사람들이 도울 수 있기를 바랍니다.

+1

정적 분석기를 사용 해본 적이 있습니까? 이 같은 것들을 발견하는 것은 매우 좋습니다. "실행"대신 "분석"을 누르십시오. – Fogmeister

+0

발생한 문제가 정확히 무엇입니까? –

+0

메모리 경고를 받기 때문에 응용 프로그램이 계속 종료됩니다. 나는 경고를 일으키는 것이 확실하지 않습니다. – erversteeg

답변

0

다른 방법으로 추가 CGImageRef를 생성하는 것으로 나타났습니다.