Ошибка памяти 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 напрямую, а также другой делегат для обработки результатов.