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

Работала отлично для меня! Надеюсь, это поможет:)