Как узнать, что вызывает ошибку didHideZoomSlider на IOS 8?

В журналах сбоя моего приложения постоянно появляется следующая ошибка.

на iOS 8:

libobjc.A.dylib objc_msgSend + 5 didHideZoomSlider:

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000e 

Я понятия не имею, с чего начать? Кто-нибудь знает, что я должен искать?

Весь стек:

 0
libobjc.A.dylib     
objc_msgSend + 5 
didHideZoomSlider:
1 Foundation    
__NSFireDelayedPerform + 468
2
CoreFoundation  
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 14
3
CoreFoundation  
__CFRunLoopDoTimer + 650
4
CoreFoundation  
__CFRunLoopRun + 1418
5
CoreFoundation  
CFRunLoopRunSpecific + 456
6
    CoreFoundation  
CFRunLoopRunInMode + 106
7
GraphicsServices    
GSEventRunModal + 136
8
UIKit   
UIApplicationMain + 1440
9
main.m line 8
main

Означает ли сообщение об ошибке, что что-то не так с ImagePickerCameraView?

я тоже иногда получаю

 Crashed: com.apple.main-thread
 EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0xeec1ff5e
 0 libobjc.A.dylib  objc_msgSend + 21 didHideZoomSlider:

Если ImagePicker создает проблемы, вот фрагмент кода:

- (IBAction)onTakePictureToolbarButtonPushed:(id)sender {
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setSourceType:
        [UIImagePickerController  isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
            ? UIImagePickerControllerSourceTypeCamera
            : UIImagePickerControllerSourceTypePhotoLibrary
    ];

    [imagePicker setDelegate:self];
    [self presentViewController:imagePicker animated:YES completion:nil];
}



- (void)imagePickerController: (UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info {
UIImage* rawImage = [info objectForKey: UIImagePickerControllerOriginalImage];

NSData *imageData = UIImageJPEGRepresentation(rawImage, 0.3);
[imageData writeToFile: @"img.jpg" atomically: YES];

[self dismissViewControllerAnimated: YES completion:nil];
[self.tableView reloadData];

}

person jack    schedule 10.11.2014    source источник
comment
Вы должны вставить свой код :)   -  person Nicolò Ciraci    schedule 12.11.2014
comment
Кодовая база довольно большая, и я понятия не имею, что вызывает ошибку?   -  person jack    schedule 12.11.2014
comment
Так как didHideZoomSlider: это метод класса CAMCameraView (он частный), вам следует проанализировать часть кода, использующую камеру.   -  person Nicolò Ciraci    schedule 12.11.2014
comment
Я добавил код, но он действительно выглядит невинным для меня ....   -  person jack    schedule 12.11.2014
comment
Мы не можем помочь вам таким образом.   -  person Nicolò Ciraci    schedule 12.11.2014
comment
да, я знаю. Но вы помогли мне указать мне на CAMCameraView. Просто... что бы я ни делал, я не могу воспроизвести сбой. но все равно спасибо за комментарий   -  person jack    schedule 12.11.2014
comment
Чтобы воспроизвести: при увеличении масштаба появляется ползунок, который анимируется примерно через 3 секунды. Я считаю, что «didHideZoomSlider» вызывается после завершения. Вам нужно увеличить масштаб, затем либо сделать снимок, либо отменить, чтобы просмотр был закрыт. Чтобы он вылетел, представление должно быть закрыто после того, как ползунок начнет исчезать, но до его завершения.   -  person PaulB    schedule 18.09.2015


Ответы (3)


Я смог воспроизвести эту проблему в своем коде. Похоже, это ошибка в коде Apple и проблема времени.

Я не воспроизвел его, щелкнув, чтобы сделать фотографию, но я могу воспроизвести его, нажав кнопку «Отмена». Вы можете попробовать сделать это в своем коде и посмотреть, работает ли он для вас. Откройте камеру, чтобы сделать снимок, а затем сведите пальцы, чтобы увеличить. На экране появится небольшой ползунок масштабирования. Примерно через 4-5 секунд этот слайд исчезает. Здесь вступает в действие время. Если вы нажмете кнопку «Отмена» только, когда оно начнет исчезать, вы можете вызвать сбой.

Я предполагаю, что у Apple есть блок анимации, в котором ползунок масштабирования исчезает. В завершении этой анимации он вызывает didHideZoomSlider: без проверки ссылки на средство выбора изображения.

Я думаю, что проще воспроизвести мой код отмены, потому что он очень прост:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

Я предполагаю, что, поскольку это выполняется так быстро, его можно отклонить в середине этой анимации. Поэтому мое решение состоит в том, чтобы на самом деле отсрочить отказ от представления на небольшой промежуток времени.

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    __weak typeof(self) wSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [wSelf dismissViewControllerAnimated:YES completion:nil];
    });
}

Я не думаю, что это «решает» проблему, но уменьшает ее так, что я больше не могу ее воспроизвести. Это следует зарегистрировать в Apple как ошибку (что я и сделаю дальше).

Обновление: отправлено в Apple.

person RyanJM    schedule 12.11.2014
comment
Большое спасибо! Я могу подтвердить, что могу воспроизвести ошибку (хотя мне нужно 10 попыток). По этому поводу есть место, где я могу просмотреть все отчеты об ошибках IOS и следить за их статусом. еще раз большое спасибо!! - person jack; 13.11.2014
comment
Да, мне тоже приходилось несколько раз. :) Похоже, вы не можете найти чужой отчет об ошибке (я этого тоже не знал). stackoverflow.com/ вопросы/144873/ - person RyanJM; 13.11.2014
comment
Не будет ли это исправление просто сдвигать ошибку синхронизации, фактически не удаляя ее? - person RonLugge; 31.07.2015
comment
@RonLugge, это правильно. Как уже упоминалось, на самом деле это не исправляет ошибку. См. ответ Адамупа ниже. Кажется, это лучшее решение. - person RyanJM; 05.08.2015
comment
@RyanJM, к сожалению, исправляет это только для отмены, а не для связанного с этим сбоя при фактической съёмке фотографии. - person RonLugge; 06.08.2015
comment
Знаете ли вы (т.е. обновлялся ли ваш отчет об ошибке), было ли это исправлено в iOS9? - person Adam S; 21.09.2015
comment
У меня нет обходных путей (пока), и я вижу отчеты о сбоях как для iOS 8, так и для iOS 9. - person Pascal Bourque; 30.09.2015

Мне не очень повезло с добавлением задержки. В моем случае все еще происходили сбои (iOS 8 и 9.0.1).

Существует OpenRadar, который предлагает удалить делегата CAMZoomSlider, вероятно, ответственного за сбой, и это сработало для меня.

Однако пользователь должен быть осторожен, так как это манипулирует частным классом и может привести к отклонению отправки в App Store...

Чтобы исправить проблему с делегатом, создайте подкласс UIImagePickerController и добавьте следующее:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self clearZoomSliderDelegateForClass:[self sliderClass] subviews:self.view.subviews];
}

- (void)clearZoomSliderDelegateForClass:(Class)sliderClass subviews:(NSArray *)subviews {
    for (UIView *subview in subviews) {
        if ([subview isKindOfClass:sliderClass] && [subview respondsToSelector:@selector(setDelegate:)]) {
            [subview performSelector:@selector(setDelegate:) withObject:nil];
            return;
        }
        else {
            [self clearZoomSliderDelegateForClass:sliderClass subviews:subview.subviews];
        }
    }
}

- (Class)sliderClass {
    for (NSString* prefix in @[@"CAM", @"CMK"]) {
        Class zoomClass = NSClassFromString([prefix stringByAppendingString:@"ZoomSlider"]);
        if (zoomClass != Nil) {
            return zoomClass;
        }
    }
    return Nil;
}

В iOS 9 SDK префикс частной платформы CameraKit изменился с CAM на CMK (просто проверьте ползунок с помощью визуального отладчика), поэтому предыдущий обходной путь пришлось обновить.

Этот сбой также может выглядеть в журналах следующим образом:

0   libobjc.A.dylib                      0x3591fae6 objc_msgSend + 6
1   Foundation                           0x24d28e59 __NSFireDelayedPerform + 466
...
person adamup    schedule 30.04.2015
comment
Кто-нибудь использует это в рабочем приложении? - person RyanJM; 23.07.2015
comment
Я использую это производство в течение нескольких месяцев - на сегодняшний день никаких проблем. Не было отклонено во время проверки в App Store. - person adamup; 23.07.2015
comment
Большое спасибо - это помогло мне избежать сбоя... Кстати, я все еще на 8.3. - person srvy; 10.08.2015
comment
Исправлена ​​ошибка на iOS 9? Безопасно ли запускать этот обходной путь на iOS 9? - person user370773; 23.09.2015
comment
Я не проверял, исправлено ли это на iOS 9, но пока что оно работает на iOS 9 без каких-либо проблем. - person adamup; 23.09.2015
comment
Я заметил, что оригинальные сбои objc_msgSend больше не происходят, но получил два отчета о сбоях, таких как: -[UITextView didHideZoomSlider:]: отправлен нераспознанный селектор -[__NSCFType didHideZoomSlider:]: отправлен нераспознанный селектор - person user370773; 24.09.2015
comment
Вполне возможно, что проблема была исправлена ​​в iOS 9. Я еще не видел этот отчет о сбое, но сообщу, если увижу. - person adamup; 24.09.2015
comment
У меня нет обходных путей (пока), и я вижу отчеты о сбоях как для iOS 8, так и для iOS 9. - person Pascal Bourque; 30.09.2015
comment
@PascalBourque — вы используете обновленную версию для iOS 9? Проницательный редактор добавил поддержку нового префикса фреймворка для CameraKit, и он проходит мои тесты. - person adamup; 01.10.2015
comment
@adamup Я просто хотел подтвердить, что сбой не был исправлен Apple в iOS 9: мое неисправленное приложение все еще сообщает о сбоях в iOS 9. Я действительно реализую обновленный обходной путь. - person Pascal Bourque; 01.10.2015
comment
@PascalBourque - спасибо за обновление! высоко ценится. - person adamup; 01.10.2015
comment
@adamup Это сэкономило мне много времени (после того, как я потратил много времени на диагностику проблемы - мы используем Cordova). Мы можем подтвердить, что он существует в версии 9 — я добавил код и разветвил репозиторий камеры Cordova (github.com/LiamBateman/cordova-plugin-camera) — он не будет объединен обратно, но может кому-то помочь — спасибо за код. - person LiamB; 11.03.2016
comment
@LiamB Рад, что это помогло! Спасибо за отзыв о iOS9. Я не видел ни одного сбоя с тех пор, как добавил исправление. - person adamup; 11.03.2016

На этот вопрос уже дан ответ, но другим потенциальным решением здесь может быть сохранение экземпляра контроллера средства выбора изображений внутри контроллера представления, чтобы избежать его освобождения до запуска обратного вызова Apple.

person shawnwall    schedule 16.07.2015
comment
Спасибо @shawnwall. На самом деле мой UIImagePickerController сохранился, и я все еще получаю сбой. - person RyanJM; 23.07.2015