AVCameraViewController.m от Apple Пример обновления кода до последних предупреждений iOS 11 - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над этим уже неделю, медленно удаляя предупреждения и ошибки, вызванные устареванием кода Objective-C, в том, что сейчас почти работает. Я до 15 предупреждений об износе.

Этот блок кода для меня особенно сложен. Он возвращает даже амортизацию для iOS 11.0. Я хочу сказать ...

1. JPEGPhotoDataRepresentationForJPEGSampleBuffer:previewPhotoSampleBuffer:' is deprecated: first deprecated in iOS 11.0 - Use -[AVCapturePhoto fileDataRepresentation] instead.

2. Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
Insert 'self->'
3. Incompatible pointer types sending 'CMSampleBufferRef *' (aka 'struct opaqueCMSampleBuffer **') to parameter of type 'CMSampleBufferRef _Nullable' (aka 'struct opaqueCMSampleBuffer *'); dereference with *
Replace '_previewPhotoSampleBuffer' with '*(_previewPhotoSampleBuffer)'




        // Flash set to Auto for Still Capture
    [CameraViewController setFlashMode:AVCaptureFlashModeAuto forDevice:[[self videoDeviceInput] device]];

    // Capture a still image.
    [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:[[self stillImageOutput] connectionWithMediaType:AVMediaTypeVideo] completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

        if (imageDataSampleBuffer)
        {    
            NSData *imageData = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer:imageDataSampleBuffer previewPhotoSampleBuffer:_previewPhotoSampleBuffer];

            UIImage *image = [[UIImage alloc] initWithData:imageData];
            [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:nil];
        }
    }];
});

1 Ответ

0 голосов
/ 16 мая 2018
  1. Метод JPEGPhotoDataRepresentationForJPEGSampleBuffer:previewPhotoSampleBuffer: устарел в iOS 11 из-за новой поддержки кодека HEIC для изображений. Как говорится в предупреждении, вы должны использовать -[AVCapturePhoto fileDataRepresentation]. Если вам действительно нужно предварительное изображение, используйте свойство AVCapturePhoto.previewPixelBuffer.

  2. Это предупреждение связано с тем, что блок, переданный в качестве обработчика завершения в captureStillImageAsynchronouslyFromConnection:connectionWithMediaType: completionHandler:, использует _previewPhotoSampleBuffer, который (предположительно) является переменной экземпляра класса, в котором находится этот код. Когда вы обращаетесь к переменной экземпляра, вы на самом деле это self->_previewPhotoSampleBuffer. Поскольку для этого требуется self, блок захватывает его, потенциально создавая цикл сохранения. Компилятор предупреждает вас, потому что без явного использования self вы вряд ли заметите это сами. Вы можете отключить предупреждение, выполнив self->_previewPhotoSampleBuffer, но я думаю, что изменения для исправления предупреждения 1 все равно удалят этот код.

  3. Похоже, что _previewPhotoSampleBuffer был объявлен как CMSampleBufferRef * (другими словами, указатель на CMSampleBufferRef). Однако CMSampleBufferRef уже является указателем. Это typedef для opaqueCMSampleBuffer *. Таким образом, вы передаете указатель на указатель в метод, который ожидает один указатель, известный как CMSampleBufferRef. Вам нужно будет это исправить везде, где вы объявите _previewPhotoSampleBuffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...