iOS SDK: добавление AVCaptureVideoDataOutput к AVCaptureSession приводит к медленной утечке памяти на неопределенный срок - PullRequest
0 голосов
/ 08 января 2012

У меня есть супер базовый AVCaptureSession, настроенный с AVCaptureVideoDataOutput и AVCaptureStillImageOutput. AVCaptureVideoDataOutput не имеет делегата буфера. Ничего особенного не происходит, просто устанавливается стандартная проблема AVCaptureSession. Если я просто скомпилирую приложение и оставлю его там на 10 минут, доступная память будет уменьшаться примерно на 1 Мб каждую минуту или около того. Я запустил приложение с 72 МБ свободного места, и, просто оставив его на своем столе, увидел, что объем свободной памяти уменьшился до 33 МБ.

Если я закомментирую часть, в которой я добавлю AVCaptureVideoDataOutput к сеансу, доступная память останется около 70-72 МБ.

Поэтому я установил кнопку для удаления AVCaptureVideoDataOutput из сеанса, и после нажатия кнопки доступная память сразу же возвращается к тому моменту, когда приложение запускалось впервые (~ 72 МБ). Кто-нибудь еще видел это и знает об обходном пути? У меня iOS 5.0 на моем iPhone и последняя бета-версия SDK.

Редактировать: вот код, который добавляет AVCAptureVideoDataOutput:


...

NSNumber *rgbNum = [NSNumber numberWithInt:kCVPixelFormatType_32BGRA];
NSDictionary *videoSettings = [NSDictionary dictionaryWithObject:rgbNum forKey:(id)kCVPixelBufferPixelFormatTypeKey];

dataOutput = [AVCaptureVideoDataOutput new];
[dataOutput setAlwaysDiscardsLateVideoFrames:YES];
[dataOutput setVideoSettings:videoSettings];
_videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", NULL);
[dataOutput setSampleBufferDelegate:self queue:_videoDataOutputQueue];
dispatch_release(_videoDataOutputQueue);

if ([session canAddOutput:dataOutput]) {
  [session addOutput:dataOutput];
} else {
  NSLog(@"couldn't add av data output");
}
...

Комментирование делегата буфера, похоже, не имеет значения.

Только что попробовал это снова, и оно ушло с ~ 70 Мб свободного до ~ 54 Мб свободного в течение 6 минут. (

Ответы [ 2 ]

1 голос
/ 23 января 2012

Видимо, нет обходного пути для этого - подал ошибку с Apple.

Edit: Этот вопрос немного устарел, но на случай, если он кому-нибудь поможет: я не на 100% уверен, но я думаю, что причина, по которой я это увидел, в том, что у меня были включены объекты-зомби! Убедитесь, что в Xcode не включены объекты-зомби, и посмотрите, поможет ли это! Перейдите в «Редактировать схему ...», затем выберите вкладку «Диагностика».

1 голос
/ 08 января 2012

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

Для проверки утечек памяти - лучше использовать профилировщик с трекером утечек, а не только доступную текущую память.

ТакжеХорошая идея проверить поведение на выпущенном iOS SDK - у беты могут быть некоторые проблемы, так как это бета ...

...