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]; }