ZBarReaderViewController在iOS 7中与内存有关的问题

我使用ZBarReaderViewController扫描QR码。 它在iOS 6上完美的工作。但是,当我用我的项目的iOS 7,那么它不正确的工作与ZBarReaderViewController

问题与内存有关,它需要多于100 MB的空间,而且此时我的设备处于挂起状态。

一般在我的项目。 用户可以扫描QR生成器图像,我有识别QR码的代码与我从服务器得到的string有关的function,如果是,那么我去下一个视图控制器,否则保持当前(继续QR扫描)屏幕。

如果QR码与我的string马赫,然后在下一个屏幕上有“取消”button,这是扫描另一个代码(这意味着我到前一个viewController (QR扫描) )。

当时当我去下一个viewController和回到先行(QR扫描屏幕),然后每次我得到ZBarReaderViewController是分配(可能)内存相关的问题生成。

但我写代码

 if(self.ZBarReaderVC) { for(UIView *subVies in self.ZBarReaderVC.cameraOverlayView.subviews) [subVies removeFromSuperview]; for(UIView *subVies in self.ZBarReaderVC.view.subviews) [subVies removeFromSuperview]; [self.ZBarReaderVC removeFromParentViewController]; self.ZBarReaderVC = nil; } 

[self.ZBarReaderVC dismissModalViewControllerAnimated: YES]; 我在最后时间删除ZBarReaderViewController然后为什么每次我分配ZBarReaderViewController ???

而且我把[self.ZBarReaderVC.readerView stop]; 之前closuresZBarReaderViewController来停止扫描阅读器的stream,但也没有为我工作。

但是我试图解决我的问题几个小时,但我无法解决我的问题

请帮帮我。

阿洛斯我发现了类似的问题

Zbar SDK和ios7 / xcode 5 – 应用程序达到100%cpu的使用和内存超过100MB

http://sourceforge.net/p/zbar/discussion/1072195/thread/df4c215a/

但没有人能帮助我。

我发现在iOS 7问题发生在

 self.ZBarReaderVC.view.frame = self.view.bounds; 

我把断点放在这里,并检查每当我从以前的viewController烘烤,它需要更多的时间和内存(问题)在这个代码。

所以首先我需要删除self.ZBarReaderVC与它的所有子视图的视图..所以首先我需要写

 if(self.ZBarReaderVC) // first check `self.ZBarReaderVC` is created or not? { [self.ZBarReaderVC.readerView stop]; // then stop continue scanning stream of "self.ZBarReaderVC" for(UIView *subViews in self.ZBarReaderVC.view.subviews) // remove all subviews [subViews removeFromSuperview]; [self.ZBarReaderVC.view removeFromSuperview]; self.ZBarReaderVC.view = nil; } 

我也得到了iOS 7 self.ZBarReaderVC保持继续扫描QR码stream,所以每次我们需要停止它,只要你的QR码扫描完成,你需要解散你的self.ZBarReaderVC然后首先停止扫描[self.ZBarReaderVC.readerView stop];

有些时候用户需要编写/调用(用于执行某些types的额外function)

 [self.ZBarReaderVC viewDidLoad]; [self.ZBarReaderVC viewWillAppear:NO]; [self.ZBarReaderVC viewDidAppear:NO]; 

self.ZBarReaderVC方法,那么它不需要在iOS 7使用,所以如果任何用户调用self.ZBarReaderVC这种方法,那么请把它置于注释。

我希望这个build议对别人有帮助。 谢谢 :)

如果您仅针对iOS7的应用程序,那么我会弃用ZBar组件,并使用本机AVFoundation方法,使viewcontroller成为AVCaptureMetadataOutputObjectsDelegate。 以3%的CPU使用率正常工作:

viewcontroller.h:

 @interface viewcontroller : UIViewController <AVCaptureMetadataOutputObjectsDelegate> { AVCaptureSession *_session; AVCaptureDevice *_device; AVCaptureDeviceInput *_input; AVCaptureMetadataOutput *_output; AVCaptureVideoPreviewLayer *_prevLayer; UIView *_highlightView; } 

viewcontroller.m

 - (IBAction)btnScan:(id)sender { _session = [[AVCaptureSession alloc] init]; _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error = nil; _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error]; if (_input) { [_session addInput:_input]; } else { NSLog(@"Error: %@", error); } _output = [[AVCaptureMetadataOutput alloc] init]; [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [_session addOutput:_output]; _output.metadataObjectTypes = [_output availableMetadataObjectTypes]; _prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; _prevLayer.frame = self.view.bounds; _prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; [self.view.layer addSublayer:_prevLayer]; [_session startRunning]; } - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { AVMetadataMachineReadableCodeObject *barCodeObject; NSString *detectionString = nil; NSArray *barCodeTypes = @[AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeQRCode]; for (AVMetadataObject *metadata in metadataObjects) { for (NSString *type in barCodeTypes) { if ([metadata.type isEqualToString:type]) { barCodeObject = (AVMetadataMachineReadableCodeObject *) [_prevLayer transformedMetadataObjectForMetadataObject: (AVMetadataMachineReadableCodeObject *)metadata]; detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue]; break; } } if (detectionString != nil) { NSLog(@"%@", detectionString); [self buscarCarga:detectionString]; //Do whatever you want with the data [_session stopRunning]; AVCaptureInput* input = [_session.inputs objectAtIndex:0]; [_session removeInput:input]; AVCaptureVideoDataOutput* output = (AVCaptureVideoDataOutput*)[_session.outputs objectAtIndex:0]; [_session removeOutput:output]; [_prevLayer removeFromSuperlayer]; } else NSLog(@"No data"); } } 
 - (void)viewDidLoad { [super viewDidLoad]; self.ZBarReaderVC = [ZBarReaderViewController new]; self.ZBarReaderVC.readerDelegate=self; self.ZBarReaderVC.supportedOrientationsMask = ZBarOrientationMaskAll; ZBarImageScanner *scanner = self.ZBarReaderVC.scanner; [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; } #pragma mark - Button click method - (IBAction)startScanning:(id)sender { NSLog(@"Scanning.."); resultTextView.text = @"Scanning.."; [self presentViewController:self.ZBarReaderVC animated:YES completion:nil]; }