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 размещается в функции malloc в методе инициализации класса, а затем освобождается в методе Dealloc.

Проведя некоторое тестирование, я понял, что не получаю предупреждения, если не присваиваю значения блокам памяти.

Я думал, что когда вы присваиваете значение, например

 rawData[i] = value

что он просто перезаписывает это место в памяти.

Все эти низкоуровневые вещи для меня в новинку, надеюсь, вы, ребята, сможете помочь.


person erversteeg    schedule 07.03.2013    source источник
comment
Вы использовали статический анализатор? Он очень хорошо замечает такие вещи. Просто нажмите «Анализ», а не «Выполнить».   -  person Fogmeister    schedule 07.03.2013
comment
в чем именно проблема, с которой вы столкнулись?   -  person La bla bla    schedule 07.03.2013
comment
Приложение продолжает закрываться, потому что оно получает предупреждение о памяти. Я не уверен, что вызывает предупреждение.   -  person erversteeg    schedule 07.03.2013


Ответы (1)


Оказывается, мы создавали дополнительный CGImageRef другим методом.

person erversteeg    schedule 24.04.2013