Ошибка памяти ZBar на iOS?

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

А именно, похоже, что существует серьезная утечка памяти, которая экспоненциально растет с каждым новым дисплеем readerView. после того, как примерно 10-кратное использование памяти начинает экспоненциально возрастать, а около 20-кратной программы сканирования становятся непригодными.

Я видел пример, который построен с той же версией, и с этим нет никаких проблем. Я также попробовал метод flushCache на readerView, но это не помогает.

Это один патч: http://sourceforge.net/p/zbar/patches/36/, но я не вижу для него никакого кода. Поскольку у меня нет полного исходного кода, я не могу его найти...

У кого-то была такая же проблема?

Ответ 1

Я нашел ту же проблему с текущей стабильной версией ZBar 0.10 и исправил ее путем подкласса ZBarReaderViewController и переопределения метода loadView. Теперь я могу запускать сканер снова и снова, пока память не сходит с ума.

Здесь полный код:

... header

#import <Foundation/Foundation.h>
#import "ZBarReaderViewController.h"

@interface CVZBarReaderViewController : ZBarReaderViewController
@end

.. и реализация

#import "CVZBarReaderViewController.h"

@implementation CVZBarReaderViewController 
- (void) loadView
{
    self.view = [[[UIView alloc] initWithFrame: CGRectMake(0, 0, 320, 480)] autorelease];
}
@end

Не забудьте отметить файл .m как недуговую. Перейдите в раздел "Настройки проекта" / "Целевые/Сформировать фазы/Скомпилировать источники" и отметьте CVZBarReaderViewController.m с -fno-objc-arc.

Ответ 2

На самом деле вот код для патча

diff --git a/iphone/ZBarReaderViewController.m b/iphone/ZBarReaderViewController.m
--- a/iphone/ZBarReaderViewController.m
+++ b/iphone/ZBarReaderViewController.m
@@ -320,8 +320,8 @@

 - (void) loadView
 {
-    self.view = [[UIView alloc]
-                    initWithFrame: CGRectMake(0, 0, 320, 480)];
+    self.view = [[[UIView alloc]
+                  initWithFrame: CGRectMake(0, 0, 320, 480)] autorelease];
 }

 - (void) viewDidLoad

это файл .diff, если у вас есть доступ к репо, вы можете легко применить патч, но поскольку это короткий, вы также можете сделать это вручную. Вам просто нужно добавить вызов autorelease в loadView метод ZBarReaderViewController class

Ответ 3

Я нашел временное (надеюсь, временное) обходное решение. Вместо использования ZBarReaderViewController я использую ZBarReaderView напрямую, а также другой делегат для обработки результатов.