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
같은 값을 할당 할 때 그냥 메모리에 그 자리를 덮어 씁니다 생각했다.
이 모든 저급 수준의 것들은 모두 저에게 새로운 것입니다. 사람들이 도울 수 있기를 바랍니다.
정적 분석기를 사용 해본 적이 있습니까? 이 같은 것들을 발견하는 것은 매우 좋습니다. "실행"대신 "분석"을 누르십시오. – Fogmeister
발생한 문제가 정확히 무엇입니까? –
메모리 경고를 받기 때문에 응용 프로그램이 계속 종료됩니다. 나는 경고를 일으키는 것이 확실하지 않습니다. – erversteeg