Ориентация камеры iPhone AVFoundation

Будьте проще:

+(instancetype)sharedInstance
{
    static dispatch_once_t pred;
    static id sharedInstance = nil;
    dispatch_once(&pred, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

- (void)dealloc
{
    // implement -dealloc & remove abort() when refactoring for
    // non-singleton use.
    abort();
}

Вот и все. Переопределение retain, release, retainCount и всего остального просто скрывает ошибки и добавляет кучу ненужного кода. Каждая строка кода - это ошибка, ожидающая своего появления. В действительности, если вы вызываете dealloc для вашего общего экземпляра, у вас есть очень серьезная ошибка в вашем приложении . Эта ошибка должна быть исправлена, а не скрыта.

Этот подход также поддается рефакторингу для поддержки не-одиночных режимов использования. Практически каждый синглтон, выживший после нескольких выпусков, в конечном итоге будет преобразован в не-синглтонную форму. Некоторые (например, NSFileManager) продолжают поддерживать одноэлементный режим, а также поддерживают произвольное создание экземпляров.

Обратите внимание, что вышесказанное также «просто работает» в ARC.

35
задан Stefan 30 January 2016 в 19:36
поделиться

1 ответ

Swift 4 & Swift 5.

Здесь мы идем:

private var requests = [VNRequest]()
let exifOrientation = exifOrientationFromDeviceOrientation()
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientation, options: [:])
do {
  try imageRequestHandler.perform(self.requests)
} catch {
  print(error)
}

public func exifOrientationFromDeviceOrientation() -> CGImagePropertyOrientation {
    let curDeviceOrientation = UIDevice.current.orientation
    let exifOrientation: CGImagePropertyOrientation

    switch curDeviceOrientation {
    case UIDeviceOrientation.portraitUpsideDown:  // Device oriented vertically, home button on the top
        exifOrientation = .upMirrored
    case UIDeviceOrientation.landscapeLeft:       // Device oriented horizontally, home button on the right
        exifOrientation = .left
    case UIDeviceOrientation.landscapeRight:      // Device oriented horizontally, home button on the left
        exifOrientation = .right
    case UIDeviceOrientation.portrait:            // Device oriented vertically, home button on the bottom
        exifOrientation = .up
    default:
        exifOrientation = .up
    }
    return exifOrientation
}
1
ответ дан 27 November 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: