10

我对 ZBar 扫描性能非常满意,但是如果这很重要的话,我在 ARC 下运行的项目中遇到了一个大问题。

也就是说,似乎存在严重的内存泄漏,并且随着 readerView 的每次新显示呈指数级上升。在一些 10 倍的内存使用量开始呈指数增长并且大约 20 倍的扫描程序变得无法使用之后。

我已经看到使用相同版本构建的示例,并且没有问题。我还在 readerView 上尝试了方法 flushCache,但它没有帮助。

这是一个补丁: http: //sourceforge.net/p/zbar/patches/36/,但我没有看到任何代码。由于我没有完整的源代码,我找不到它......</p>

有没有人有同样的问题?

4

3 回答 3

28

我在 ZBar 0.10 的当前稳定版本中发现了完全相同的问题,并通过子类化 ZBarReaderViewController 并覆盖 loadView 方法来修复它。我现在可以一遍又一遍地运行扫描仪,而不会让记忆变得疯狂。

这是完整的代码:

...标题

#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 文件标记为非弧。转到项目设置/目标/构建阶段/编译源并使用 -fno-objc-arc 标记 CVZBarReaderViewController.m。

于 2013-09-20T08:49:27.607 回答
7

实际上这是补丁的代码

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调用loadViewZBarReaderViewController

于 2013-09-05T14:01:55.263 回答
1

我找到了临时的(我希望是临时的)解决方法。我没有使用 ZBarReaderViewController,而是直接使用 ZBarReaderView 以及另一个委托来处理结果。

于 2013-09-06T07:55:42.740 回答