Будьте проще:
+(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.
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
}