Утечка памяти из кода Objective-C в приложении iOS - PullRequest
0 голосов
/ 31 мая 2018

Мой код ест память.Я добавил эту функцию, и кажется, что причина всех проблем в том, что когда я ее не вызываю, у меня не хватает времени.

Это функция в Objective-C для обрезки изображения.Как освободить память, использованную на аукционе, чтобы в конце функции все очищалось перед выходом.

-(void) crop: (CVImageBufferRef)sampleBuffer
{
    int cropX0, cropY0, cropHeight, cropWidth, outWidth, outHeight;

    cropHeight = 720;
    cropWidth = 1280;
    cropX0 = 0;
    cropY0 = 0;

    outWidth = 1280;
    outHeight = 720;

    CVPixelBufferLockBaseAddress(sampleBuffer,0);
    void *baseAddress = CVPixelBufferGetBaseAddress(sampleBuffer);
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(sampleBuffer);

    vImage_Buffer inBuff;
    inBuff.height = cropHeight;
    inBuff.width = cropWidth;
    inBuff.rowBytes = bytesPerRow;

    int startpos = cropY0*bytesPerRow+4*cropX0;
    inBuff.data = baseAddress+startpos;

    unsigned char *outImg= (unsigned char*)malloc(4*outWidth*outHeight);
    vImage_Buffer outBuff = {outImg, outHeight, outWidth, 4*outWidth};

    vImage_Error err = vImageScale_ARGB8888(&inBuff, &outBuff, NULL, 0);
    if (err != kvImageNoError)
    {
        NSLog(@" error %ld", err);
    }
    else
    {
        NSLog(@"Success");
    }


    CVPixelBufferRef pixelBuffer = NULL;
    OSStatus result = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                                   inBuff.width,
                                                   inBuff.height,
                                                   kCVPixelFormatType_32BGRA,
                                                   outImg,
                                                   bytesPerRow,
                                                   NULL,
                                                   NULL,
                                                   NULL,
                                                   &pixelBuffer);


    CVPixelBufferUnlockBaseAddress(sampleBuffer,0);

}

1 Ответ

0 голосов
/ 31 мая 2018

бесплатно (outImg);в конце отсутствует, так как вы не освобождаете выделенную память.Это хорошая практика во встроенном программировании, а также здесь, поскольку у вас есть размеры в пикселях постоянного размера, чтобы использовать постоянную матрицу, которую вы можете объявить в верхней части функции и инициализировать в ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...