Zbar SDK и ios7/xcode 5 - приложение достигает 100% использования процессора и памяти более 100 МБ
Мы используем считыватель штрих-кода Zbar за последние 2 года. С iOS 7 и Xcode 5 после сканирования 5 штрих-кодов приложение достигает 100% -ного использования процессора для устройства iOS 7 (я вижу, что в режиме отладки Xcode), и приложение становится менее отзывчивым. У нас никогда не было проблем в более ранних версиях iOS, все работало нормально.
Изменена ли вещь в iOS 7, связанной с запуском камеры, и ZBar SDK не обновляется? Кто-нибудь еще сталкивается с такой же проблемой с iOS 7?
Ответы
Ответ 1
Решила это сделать:
в viewdidload
readerqr = [ZBarReaderViewController new];
readerqr.readerDelegate = self;
readerqr.showsHelpOnFail = NO;
ZBarImageScanner *scanner = readerqr.scanner;
[scanner setSymbology: 0
config: ZBAR_CFG_ENABLE
to: 0];
[scanner setSymbology: ZBAR_QRCODE
config: ZBAR_CFG_ENABLE
to: 1];
// you can use this to support the simulator
if(TARGET_IPHONE_SIMULATOR) {
cameraSim = [[ZBarCameraSimulator alloc]
initWithViewController: self];
cameraSim.readerView = readerView;
}
создайте ZBarReaderViewController *readerqr;
как свойство вашего диспетчера просмотров.
чтобы использовать его:
-(void) showqr:(id)sender
{
[self presentViewController:readerqr animated:YES completion:nil];
return;
}
Этот способ работает, нет утечки, нет процессора 100%
Ответ 2
После просмотра той же проблемы
Я переехал из
ZBarReaderViewController
to
ZBarReaderView
Ужасная часть этого, однако, заключается в том, что если вы используете такие функции, как Overlay в ZBarReaderViewController, вы должны перекодировать, как все это работает, и вы должны выполнять такие функции, как запуск и остановка сканера вручную.
Но, по сути, вам нужно что-то подобное в своем IBAction:
ZBarReaderView *reader = [ZBarReaderView new];
[self.view addSubview:reader];
reader.readerDelegate = self;
reader.tracksSymbols=YES;
ZBarImageScanner *scanner = reader.scanner;
reader.tag = 99999999;
//Важная часть здесь - НАЧАТЬ сканирование
[reader start];
Кроме того, не забудьте изменить свой делегат в своем заголовке на ZBarReaderViewDelegate
Кроме того, делегатский "метод", который вызывается, по крайней мере, в моем коде, теперь (по сравнению с imagePickerController)
-(void) readerView: (ZBarReaderView*) view
didReadSymbols: (ZBarSymbolSet*) syms
fromImage: (UIImage*) img
{
for(ZBarSymbol *sym in syms) {
[view stop];
[self closeCameraScanner];
// I am also setting reader to NIL but I don't really know if this is necessary or not.
reader=nil;
}
}
-(void)closeCameraScanner{
UIView * v = [self.view viewWithTag:99999999];
if (nil != v) {
[v removeFromSuperview];
}
[self.view endEditing:YES];
}
Итак, это быстрый и грязный способ сделать это. У меня есть дополнительный код для ручного создания оверлея и ограничения урона сканирования, но, поскольку он просто запускается, это помогло мне.
Ответ 3
Я решил проблему, с которой столкнулся Барри Мак.
У меня были те же проблемы, даже после исправленного zBar SDK с iOS7 от http://nerdvision.net/app-development/ios/zbar-sdk.
(5-й - 6-й раз открытие страницы, зависающей на 100% CPU.)
Если вы подклассифицируете ZBarViewController или используете его напрямую, вы представляете контроллер представления и увольняете его позже, когда вы закончите со сканером. Я нашел причину, по которой это произошло, и причина в том, что я не остановил потоковое видео. В ZBarReaderView есть функция - (void) stop; и если вы запустите эту функцию после завершения работы с сканером, вы не увидите проблемы (5-6-й раз открываете страницу, которая застывает на 100% CPU). По крайней мере, в моем случае это сработало и надеется, что это сработает и для вас.
Ответ 4
i теперь исправил проблему с реализацией Diff из источника.
Если кому-то это понадобится, вы можете скачать скомпилированный SDK SDK с поддержкой iOS7 здесь.
Вы можете просто заменить libzbar.a - это должно работать. Но я загрузил полный SDK, так как кому-то это может понадобиться также с заголовками и т.д.
http://nerdvision.net/app-development/ios/zbar-sdk
Ответ 5
Я был такой же проблемой и легко исправлялся.
Не помните о нижнем коде.
Вы должны поместить этот код в режим чтения.
[остановка чтения];
Проблема с загрузкой cpu была причиной дублирования потока камеры.
Ответ 6
У меня такая же проблема, как и у OP, я попытался выполнить поиск в google, а также стек над потоком, но я не смог найти правильный ответ, поэтому я спросил Question на этом сайте. И я нашел и решил свой вопрос своим собственным ответом.
Так что это может быть полезно для другого разработчика (s), у кого такая же проблема, как у меня, и может сэкономить ваше время.
Спасибо:)
Ответ 7
были те же проблемы, сканер кажется замороженным.
Я исправил его как joaquin...
Сделайте свойство для читателя, и когда вы вызываете его несколько раз, вы можете проверить, если объект читателя, где инициализируется...
Вот что я делаю:
- (IBAction)ShowZBarReader
{
// ADD: present a barcode reader that scans from the camera feed
if (!self.reader) {
self.reader = [[ZBarReaderViewController alloc]init];
}
self.reader.readerDelegate = self;
self.reader.supportedOrientationsMask = ZBarOrientationMaskAll;
ZBarImageScanner *scanner = self.reader.scanner;
// zusätliche Configurationen ...
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
// stellt Bild zur verfügung
[self presentViewController:self.reader animated:YES completion:nil];
}
Работала отлично для меня! Надеюсь, это поможет:)