Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ZBar memory leak on iOS?

Tags:

ios

zbar-sdk

I am very satisfied with ZBar scanning performance, however I ran into a big problem on a project that runs under ARC if that counts at all.

Namely, it seems that there is a serious memory leak that rises exponentially with each and every new display of the readerView. after some 10x memory usage starts to rise exponentially and around 20x scan program become unusable.

I have seen example that are build with same version and there is no problem with it. I also tried method flushCache on readerView, but it doesn't help.

THere is one patch: http://sourceforge.net/p/zbar/patches/36/, but I don't see any code for it. Since I don't have full source code I cannot find it …

Has anybody had same problem?

like image 636
mbpro Avatar asked Sep 05 '13 13:09

mbpro


Video Answer


2 Answers

I found exactly the same problem with the current stable version of ZBar 0.10, and fixed it by subclassing ZBarReaderViewController and overriding the loadView method. I can now run the scanner over and over without memory going crazy.

Here's the full code:

... header

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

@interface CVZBarReaderViewController : ZBarReaderViewController
@end

.. and the implementation

#import "CVZBarReaderViewController.h"

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

Remember to mark the .m file as being non-arc. Go to Project Settings / Target / Build Phases / Compile Sources and mark CVZBarReaderViewController.m with -fno-objc-arc.

like image 97
Ben Clayton Avatar answered Oct 03 '22 22:10

Ben Clayton


Actually here is the code for the patch

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

it's a .diff file, if you had access to the repo you could easily apply the patch but since this is a short one, you can also do that manually. You just have to add an autorelease call in loadView method of ZBarReaderViewController class

like image 40
Vik Avatar answered Oct 04 '22 00:10

Vik