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");
}
}