ObjC 使用免费桥接类型铸造一个块

ObjC casting a block with toll-free-bridged types

是否可以将采用 Objective-C 类型且具有免费桥接等效项的块直接传递到需要 C 类型块的方法中?

具体例子

我根据可用性封装了 AddressBook 和 Contacts API,并且框架包含两种方法,这两种方法在所有意图和目的上都是相同的。考虑完成块参数:

CNContactStore- (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler

AddressBookvoid ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );

我有一个 void (^)(BOOL granted, NSError *error) 类型的块,如果我可以将它传递给 ABAddressBookRequestAccessWithCompletion(...) 就太好了。我知道我可以将我的 'objc' 块包装在一个以 'C types' 作为参数的块中,但是当类型是免费桥接时,这样做感觉毫无意义。

具体问题

有没有办法将 void (^)(BOOL granted, NSError *error 类型的对象转换为 void(^)(bool granted, CFErrorRef error) 类型?如果可以,语法是什么? ARC 环境中所有权的含义是什么?

简单地施放方块。

作为一个非常粗略的例子:

typedef void(^InternalBlock)(bool granted, CFErrorRef error);

- (void)requestAccess:(void (^)(BOOL, NSError *))completion {

    if ([CNContactStore class]) {
        [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:completion];
    } else {
        ABAddressBookRequestAccessWithCompletion(addressBook, (InternalBlock)completion);
    }

}