Чтобы избежать проблем с памятью, просто создайте пул автоматического выпуска в captureOutput:didOutputSampleBuffer:fromConnection:
.
Это имеет смысл, поскольку imageFromSampleBuffer:
возвращает объект UIImage с автоматическим выпуском.Кроме того, он сразу освобождает любые автоматически выпущенные объекты, созданные кодом обработки изображений.
// Delegate routine that is called when a sample buffer was written
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Create a UIImage from the sample buffer data
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
< Add your code here that uses the image >
[pool release];
}
Мои тесты показали, что это будет выполняться без предупреждений памяти на iPhone 4 или iPod Touch (4-го поколения), даже если запрашивается FPSочень высокий (например, 60) и обработка изображений очень медленная (например, 0,5+ с).
СТАРЫЕ РЕШЕНИЯ:
Как указал Брэд, Apple рекомендует обработку изображенийбыть в фоновом потоке, чтобы не мешать отзывчивости пользовательского интерфейса.Я не заметил большой задержки в этом случае, но лучшие практики - это лучшие практики, поэтому используйте вышеупомянутое решение с пулом автоматического выпуска вместо запуска этого в основной очереди отправки / главном потоке.
Чтобы предотвратить проблемы с памятьюпросто используйте основную очередь отправки вместо создания новой.
Это также означает, что вам не нужно переключаться на основной поток в captureOutput:didOutputSampleBuffer:fromConnection:
, когда вы хотите обновить пользовательский интерфейс.
В setupCaptureSession
, изменить С:
// Configure your output.
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
[output setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
ДО:
// we want our dispatch to be on the main thread
[output setSampleBufferDelegate:self queue:dispatch_get_main_queue()];