我使用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/
但没有人可以帮助我。
答案 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];
}