Quantcast
Channel: Active questions tagged crash - Stack Overflow
Viewing all articles
Browse latest Browse all 7190

App crashes randomly in observeValueForKeyPath - iOS KVO

$
0
0

Many users of my app are having crash problems. It happens or during the opening of the app or during the use.

I'm unable to replicate the error because the problem does not occur on my devices, and I'm not managing to find a solution.

Most users will solve the problem by reinstalling the app.

In the crashlog the method that causes the bug is [AVCaptureFigVideoDevice temperatureAndTintValuesForDeviceWhiteBalanceGains:] called in [ViewController observeValueForKeyPath:ofObject:change:context:] but sometimes the crash occurs in other line of the method observeValueForKeyPath.

So I think the problem is caused by the observers.

I add the observer in the viewWillAppear and remove on viewDidDisappear

- (void)addObservers
{
    [self addObserver:self forKeyPath:@"sessionRunningAndDeviceAuthorized" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:SessionRunningAndDeviceAuthorizedContext];
    [self addObserver:self forKeyPath:@"stillImageOutput.capturingStillImage" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:CapturingStillImageContext];
    [self addObserver:self forKeyPath:@"movieFileOutput.recording" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:RecordingContext];

    [self addObserver:self forKeyPath:@"videoDeviceInput.device.focusMode" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:FocusModeContext];
    [self addObserver:self forKeyPath:@"videoDeviceInput.device.lensPosition" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:LensPositionContext];

    [self addObserver:self forKeyPath:@"videoDeviceInput.device.exposureMode" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:ExposureModeContext];
    [self addObserver:self forKeyPath:@"videoDeviceInput.device.exposureDuration" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:ExposureDurationContext];
    [self addObserver:self forKeyPath:@"videoDeviceInput.device.ISO" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:ISOContext];
    [self addObserver:self forKeyPath:@"videoDeviceInput.device.exposureTargetOffset" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:ExposureTargetOffsetContext];

    [self addObserver:self forKeyPath:@"videoDeviceInput.device.whiteBalanceMode" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:WhiteBalanceModeContext];
    [self addObserver:self forKeyPath:@"videoDeviceInput.device.deviceWhiteBalanceGains" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:DeviceWhiteBalanceGainsContext];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:[self videoDevice]];

}

- (void)removeObservers
{
  [[NSNotificationCenter defaultCenter] removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:[self videoDevice]];
  [[NSNotificationCenter defaultCenter] removeObserver:[self runtimeErrorHandlingObserver]];

  [self removeObserver:self forKeyPath:@"sessionRunningAndDeviceAuthorized" context:SessionRunningAndDeviceAuthorizedContext];
  [self removeObserver:self forKeyPath:@"stillImageOutput.capturingStillImage" context:CapturingStillImageContext];
  [self removeObserver:self forKeyPath:@"movieFileOutput.recording" context:RecordingContext];

  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.focusMode" context:FocusModeContext];
  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.lensPosition" context:LensPositionContext];

  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.exposureMode" context:ExposureModeContext];
  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.exposureDuration" context:ExposureDurationContext];
  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.ISO" context:ISOContext];
  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.exposureTargetOffset" context:ExposureTargetOffsetContext];

  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.whiteBalanceMode" context:WhiteBalanceModeContext];
  [self removeObserver:self forKeyPath:@"videoDeviceInput.device.deviceWhiteBalanceGains" context:DeviceWhiteBalanceGainsContext];

}

Here's a crashlog:

Last Exception Backtrace:
0   CoreFoundation                  0x19df7bab0 __exceptionPreprocess + 224
1   libobjc.A.dylib                 0x19dc95028 objc_exception_throw + 59
2   AVFoundation                    0x1a82ed658 -[AVCaptureFigVideoDevice temperatureAndTintValuesForDeviceWhiteBalanceGains:] + 263
3   App                         0x1002b6b90 __65-[ViewController observeValueForKeyPath:ofObject:change:context:]_block_invoke + 633744 (ViewController.m:5483)
4   libdispatch.dylib               0x19dc20b7c _dispatch_call_block_and_release + 31
5   libdispatch.dylib               0x19dc21fd8 _dispatch_client_callout + 19
6   libdispatch.dylib               0x19dc2dcc8 _dispatch_main_queue_callback_4CF + 967
7   CoreFoundation                  0x19def6e0c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 15
8   CoreFoundation                  0x19def1b68 __CFRunLoopRun + 1979
9   CoreFoundation                  0x19def1084 CFRunLoopRunSpecific + 479
10  GraphicsServices                0x1a813f534 GSEventRunModal + 107
11  UIKitCore                       0x1a2061670 UIApplicationMain + 1939
12  App                         0x100350e6c main + 1265260 (main.m:14)
13  libdyld.dylib                   0x19dd70e18 start + 3


Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x000000019dd66efc __pthread_kill + 8
1   libsystem_pthread.dylib         0x000000019dc86d10 pthread_kill + 196
2   libsystem_c.dylib               0x000000019dc16a74 abort + 104
3   libc++abi.dylib                 0x000000019dd2e3c8 __cxa_bad_cast + 0
4   libc++abi.dylib                 0x000000019dd2e5c0 demangling_unexpected_handler+ 5568 () + 0
5   libobjc.A.dylib                 0x000000019dc95308 _objc_terminate+ 25352 () + 124
6   libc++abi.dylib                 0x000000019dd3b634 std::__terminate(void (*)+ 58932 ()) + 20
7   libc++abi.dylib                 0x000000019dd3b5c0 std::terminate+ 58816 () + 44
8   libdispatch.dylib               0x000000019dc21fec _dispatch_client_callout + 40
9   libdispatch.dylib               0x000000019dc2dcc8 _dispatch_main_queue_callback_4CF + 968
10  CoreFoundation                  0x000000019def6e0c __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
11  CoreFoundation                  0x000000019def1b68 __CFRunLoopRun + 1980
12  CoreFoundation                  0x000000019def1084 CFRunLoopRunSpecific + 480
13  GraphicsServices                0x00000001a813f534 GSEventRunModal + 108
14  UIKitCore                       0x00000001a2061670 UIApplicationMain + 1940
15  App                         0x0000000100350e6c main + 1265260 (main.m:14)
16  libdyld.dylib                   0x000000019dd70e18 start + 4

Viewing all articles
Browse latest Browse all 7190

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>