Ios CIImage和CIDetector与AVCaptureOutput内存泄漏一起使用

Ios CIImage和CIDetector与AVCaptureOutput内存泄漏一起使用,ios,memory-leaks,avcapturesession,core-image,Ios,Memory Leaks,Avcapturesession,Core Image,我正在使用CIContext、CIDetector和CIImage检测vImage_缓冲区中的矩形,该缓冲区源自captureOutput:didOutputSampleBuffer:fromConnection:。似乎探测器或CIImage正在保留内存,无法释放。 下面是有问题的代码-跳过此代码表示内存保持不变,否则会增加,直到应用程序崩溃: // ...rotatedBuf and format managed outside scope // Use a CIDetector to fi

我正在使用CIContext、CIDetector和CIImage检测vImage_缓冲区中的矩形,该缓冲区源自captureOutput:didOutputSampleBuffer:fromConnection:。似乎探测器或CIImage正在保留内存,无法释放。 下面是有问题的代码-跳过此代码表示内存保持不变,否则会增加,直到应用程序崩溃:

// ...rotatedBuf and format managed outside scope

// Use a CIDetector to find any potential subslices to process
CVPixelBufferRef cvBuffer;
vImageCVImageFormatRef cvFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(pixelBuffer);
CVPixelBufferCreate(kCFAllocatorSystemDefault, rotatedBuf.width, rotatedBuf.height, kCVPixelFormatType_32BGRA, NULL, &cvBuffer);
CVPixelBufferLockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly);
err = vImageBuffer_CopyToCVPixelBuffer(&rotatedBuf, &format, cvBuffer, cvFormat, NULL, kvImageNoFlags);
CVPixelBufferUnlockBaseAddress(cvBuffer, kCVPixelBufferLock_ReadOnly);
if (![self vImageDidError:err]) {
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:cvBuffer];
    NSArray *feats = [self.ciDetector featuresInImage:ciImage options:nil];
    if (feats && [feats count]) {
        for (CIFeature *feat in feats) {
            // The frame is currently in image space, so we must convert it to a unitless space like the other rects.
            CGRect frame = feat.bounds;
            CGRect clip  = CGRectMake(frame.origin.x / rotatedBuf.width, frame.origin.y / rotatedBuf.height,
                                      frame.size.width / rotatedBuf.width, frame.size.height / rotatedBuf.height);
            rects = [rects arrayByAddingObject:[NSValue valueWithCGRect:clip]];
        }
    }
}
CVPixelBufferRelease(cvBuffer);
vImageCVImageFormat_Release(cvFormat);
其他答案似乎建议在每个帧中包装一个自动释放池或创建一个新的CIDector,但这两种方法都不会影响内存使用


编辑:将调度队列切换到调度主队列以外的队列似乎已经清除了内存问题,并使UI保持响应。

我想出了一个不同的解决方案-在我的情况下,我在主调度队列上运行所有处理。解决这种情况的方法是创建一个新队列来运行处理。我意识到,当我的大部分CPU时间都花在调用featuresInImage:options:上时,可能会出现这种情况。它没有解释是什么导致了内存问题,但是现在我在一个单独的队列中运行,内存很好而且是恒定的。

我认为这是一个非常类似的问题,但需要不同的答案。我认为我遇到的问题有不同的原因,尽管它显示出相同的症状。但这是否是一个不同的问题取决于你!我想出了一个不同的解决方案——在我的例子中,我在主调度队列上运行所有处理。解决这种情况的方法是创建一个新队列来运行处理。我意识到,当我的大部分CPU时间都花在调用featuresInImage:上时,可能会出现这种情况。它没有解释是什么导致了内存问题,但是现在我在后台线程中运行,内存很好,并且是恒定的。好吧,我会重新打开你的问题,这样你就可以给出答案了。