MPSCopyAllocator не может инициализироваться

В Objective-C я пытаюсь использовать этот метод для кодирования командного буфера на месте.

-(BOOL)    encodeToCommandBuffer: (nonnull id <MTLCommandBuffer>)commandBuffer  
                  inPlaceTexture: (__nonnull id <MTLTexture> __strong * __nonnull) texture  
           fallbackCopyAllocator: (nullable MPSCopyAllocator) copyAllocator  
                MPS_SWIFT_NAME(encode(commandBuffer:inPlaceTexture:fallbackCopyAllocator:));  

и я хотел бы создать новый MPSCopyAllocator .

я использовал следующий код из документа.

MPSCopyAllocator myAllocator = ^id <MTLTexture> _Nonnull (MPSKernel * __nonnull filter, __nonnull id <MTLCommandBuffer> cmdBuf, __nonnull id <MTLTexture> sourceTexture)  
{  
    MTLPixelFormat format = sourceTexture.pixelFormat;  
    MTLTextureDescriptor *d = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat: format width: sourceTexture.width height: sourceTexture.height mipmapped: NO];  

    id <MTLTexture> result = [cmdBuf.device newTextureWithDescriptor: d];  

    return result;  
    /  
};  

но у меня есть семантическая проблема в вопросе навигатора

Incompatible block pointer types initializing '__strong MPSCopyAllocator' (aka 'id<MTLTexture>  _Nonnull (^__strong)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer>  _Nonnull __strong, id<MTLTexture>  _Nonnull __strong)') with an expression of type 'id<MTLTexture>  _Nonnull (^)(MPSKernel * _Nonnull __strong, id<MTLCommandBuffer>  _Nonnull __strong, id<MTLTexture>  _Nonnull __strong)'  

определение MPSCopyAllocator

typedef id <MTLTexture> __nonnull NS_RETURNS_RETAINED (^MPSCopyAllocator)( MPSKernel * __nonnull filter,  
                                                                          id <MTLCommandBuffer> __nonnull commandBuffer,  
                                                                          id <MTLTexture> __nonnull sourceTexture);

Как правильно создать MPSCopyAllocator?

1 ответ

Решение

К сожалению, вам нужно включить NS_RETURNS_RETAINED в вашем определении блока при назначении его переменной:

MPSCopyAllocator allocator = ^id <MTLTexture> NS_RETURNS_RETAINED(MPSKernel *filter,
                                                                  id <MTLCommandBuffer> commandBuffer,
                                                                  id <MTLTexture> sourceTexture)
{
    // ...
};

Для краткости, я здесь пропустил аннотации обнуляемости, так как они необязательны.

Другие вопросы по тегам