iOS 7中ZBarReaderViewController的内存相关问题

时间:2013-10-28 11:33:27

标签: ios iphone objective-c cocoa-touch

我使用ZBarReaderViewController扫描QR码。它完全适用于iOS 6。 但是当我在项目中使用iOS 7时,它无法正常使用ZBarReaderViewController

问题与内存有关,需要更多 100 MB ,此时我的设备已挂起。

一般在我的项目中。用户可以扫描QR生成器图像,我有识别QR码代码与我从服务器获取的字符串相关的功能,如果是,则转到下一个视图控制器,否则保持当前(继续QR扫描)屏幕。

如果QR码用我的字符串然后在下一个屏幕上有“取消”按钮,这将扫描另一个代码(这意味着我到了以前的viewController (QR扫描))。

那时我去下一个viewController并返回到pervious(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];才解雇ZBarReaderViewController来停止扫描读者的流 但它也不适合我。

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

请帮帮我。

Alos我发现了类似的问题

Zbar SDK and ios7/xcode 5 - App is reaching 100% cpu use and memory more than 100MB

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

但没有人可以帮助我。

3 个答案:

答案 0 :(得分:6)

我发现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码流,所以每次我们需要停止它,无论何时你的QR码扫描完成,你需要取消self.ZBarReaderVC,然后按[self.ZBarReaderVC.readerView stop];

先停止扫描

有些时候用户需要编写/调用(For do /实现某些类型的额外功能)

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

self.ZBarReaderVC的方法则不需要在iOS 7中使用,因此,如果任何使用此self.ZBarReaderVC方法的用户请将其置于评论中。

我希望我的建议对其他人有帮助。 谢谢:))

答案 1 :(得分:1)

如果您仅针对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");
    }
  }

答案 2 :(得分:0)

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