2013-09-05 14 views
10

Ich bin sehr zufrieden mit ZBar Scan-Leistung, aber ich stieß auf ein großes Problem auf ein Projekt, das unter ARC läuft, wenn das überhaupt zählt.ZBar Speicherleck auf iOS?

Es scheint nämlich, dass es einen ernsthaften Speicherverlust gibt, der exponentiell mit jeder neuen Anzeige des ReaderView ansteigt. nach etwa 10x beginnt die Speicherauslastung exponentiell anzusteigen und etwa 20x Scanprogramm werden unbrauchbar.

Ich habe Beispiele gesehen, die mit der gleichen Version erstellt werden und es gibt kein Problem damit. Ich habe auch method flushCache auf ReaderView versucht, aber es hilft nicht.

Hier ist ein Patch: http://sourceforge.net/p/zbar/patches/36/, aber ich sehe keinen Code dafür. Da ich nicht vollständigen Quellcode habe, kann ich es nicht finden ...

Hat jemand das gleiche Problem gehabt?

Antwort

28

fand ich genau das gleiche Problem mit der aktuellen stabilen Version von ZBar 0,10 und fixiert sie durch ZBarReaderViewController Subklassen und die Loadview-Methode überschreiben. Ich kann jetzt den Scanner immer wieder laufen lassen, ohne dass das Gedächtnis verrückt wird.

Hier ist der vollständige Code:

... header

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

@interface CVZBarReaderViewController : ZBarReaderViewController 
@end 

.. und die Umsetzung

#import "CVZBarReaderViewController.h" 

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

Denken Sie daran, die .m-Datei als nicht-Bogen zu markieren. Gehen Sie zu Projekteinstellungen/Ziel/Build-Phasen/Quellen kompilieren und markieren Sie CVZBarReaderViewController.m mit -fno-objc-arc.

+0

Danke, Ben! Das ist natürlich eine noch elegantere Lösung. – mbpro

+0

Bei weitem die einfachste Lösung. Ich musste die Bibliothek nicht selbst neu aufbauen. Dies hat mir geholfen, einen wichtigen Ausbau bis zum Stichtag zu erreichen. Vielen Dank! – Colin

+0

Wie müssen wir den Viewer starten? Immer noch 'ZBarReaderViewController * reader = [[[ZBarReaderViewController Alloc] init] Autorelease];' oder mit 'CVZBarReaderViewController'? –

7

Eigentlich hier ist der Code für den 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 

es ist eine .diff Datei, wenn Sie den Zugriff auf die Repo haben, kann man leicht den Patch anwenden, aber da dieses ein kurzes ist, können Sie auch tun, manuell. Sie müssen nur einen autorelease Anruf in loadView Methode ZBarReaderViewController Klasse

+0

Danke für Hilfe, aber das ist das Problem - ich habe keinen Objective C Quellcode außer .h Header-Dateien, so dass ich diesen Patch nicht anwenden kann. Alles, was ich auf der Entwickler-Seite bekommen konnte, war ZBarSDK, das Header-Dateien und statische Bibliotheken enthielt. – mbpro

+0

Ich sehe :(Dann, wie soll man einen Workaround dafür machen? – Vik

+0

Die Lösung gefunden :) – mbpro

1

Anruf Ich fand temporäre (ich hoffe es ist vorübergehend) Workaround. Anstatt ZBarReaderViewController zu verwenden, verwende ich ZBarReaderView direkt und auch einen anderen Delegaten, um die Ergebnisse zu behandeln.