iOS 7中ZBarReaderViewController的内存相关问题

iOS 7中ZBarReaderViewController的内存相关问题,ios,iphone,objective-c,cocoa-touch,Ios,Iphone,Objective C,Cocoa Touch,我使用ZBarReaderViewController扫描二维码。它在iOS 6上运行得非常好。 但是当我在我的项目中使用iOS 7时,它不能与ZBarReaderViewController 这个问题与内存有关,它需要超过100 MB的内存,而我的设备此时处于挂起状态 通常在我的项目中。用户可以扫描QR发生器图像,我有识别QR代码与我从服务器获取的字符串相关的功能,如果是,则我转到下一个视图控制器,否则保持当前(继续QR扫描)屏幕 如果QR码和我的字符串在一起,那么在下一个屏幕上有“取消”按钮

我使用
ZBarReaderViewController
扫描二维码。它在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.zbarradervc解聘Modalviewcontrolleranimated:YES]之后我在结束时删除
ZBarReaderViewController
,那么为什么每次分配
ZBarReaderViewController

我还把
[self.ZBarReaderVC.readerView stop]
在关闭
ZBarReaderViewController
fro之前停止读卡器的扫描流 但它对我也不起作用

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

请帮帮我

我发现了类似的问题


但是没有人能帮我。

我发现在
ios7
中,问题发生在

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
仍在继续扫描二维码流,因此每次我们需要停止它时,只要您的二维码扫描完成,您需要关闭您的
self.ZBarReaderVC
,然后首先通过
[self.ZBarReaderVC.readerView stop]停止扫描

用户有时需要编写/调用(用于执行/实现某些类型的额外功能)

self.ZBarReaderVC的方法
则不需要在iOS 7中使用,因此如果任何调用
self.ZBarReaderVC的方法的用户
请将其放入注释中

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

如果您的应用程序只针对iOS7,我放弃了ZBar组件,使用了本机AVFoundation方法,使viewcontroller成为AVCaptureMataOutputObjectsDelegate。在CPU使用率为3%的情况下运行良好:

viewcontroller.h:

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

+1.它对我很管用。我尝试过使用dispatch_queue,但它不起作用。你的回答终于成功了。感谢您在进一步讨论这个问题之后,我注意到“self.ZBarReaderVC.view=nil;”行中有一个很大的漏洞。还有其他人经历过这种情况吗?我希望有一种方法可以多次提升它,你就是那个人!
- (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];
}
@interface viewcontroller : UIViewController <AVCaptureMetadataOutputObjectsDelegate> {
  AVCaptureSession *_session;
  AVCaptureDevice *_device;
  AVCaptureDeviceInput *_input;
  AVCaptureMetadataOutput *_output;
  AVCaptureVideoPreviewLayer *_prevLayer;
  UIView *_highlightView;
}
- (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");
    }
  }