CIContext, CIDetector 및 CIImage를 사용하여 captureOutput : didOutputSampleBuffer : fromConnection :의 샘플에서 파생 된 vImage_Buffer의 사각형을 감지합니다. 탐지기 또는 CIImage가 메모리를 보유하고있어 방출 될 수없는 것으로 보입니다. 여기에 문제의 코드 -이 코드를 통해 건너 뛰는 메모리는 응용 프로그램 충돌 할 때까지 그렇지 증가에 일정하게 유지 보여줍니다 :AVCaptureOutput 메모리 누수가있는 CIImage 및 CIDetector 사용
// ...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을 만들 것을, 메모리 사용에는 영향을주지 않습니다.
CIDetector isn't releasing memory
CIDetector won't release memory - swift
편집 : dispatch_main_queue 이외의 다른 하나는 메모리 문제를 클리어 한 듯하고, UI 응답 성 유지에 파견 큐를 전환.
매우 비슷한 질문이지만 다른 대답이 필요하다고 생각합니다. 내가 겪고있는 문제는 동일한 증상을 보이지만 다른 원인이 있다고 생각합니다. 비록 그것이 다른 질문이든간에 그것은 당신에게 달렸습니다! – schellsan
글쎄, 나는 다른 해결책을 알아 냈다. 나의 경우에는 메인 처리 대기열에서 모든 처리를하고 있었다. 처리를 실행할 새 대기열을 만드는 상황을 수정했습니다. 내 CPU 시간의 대부분이 featuresInImage : 호출에 소비 된 경우 일 수 있습니다 실현했습니다. 그것은 메모리 문제를 일으킨 원인을 설명하지는 않지만, 백그라운드 스레드 메모리에서 실행 중이므로 멋지고 상수입니다. – schellsan
자, 질문을 다시 열어 답변으로 드릴 수 있습니다. – matt