2

是否可以将采用具有免费桥接等效物的 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 类型”作为参数的块中,但是当这些类型是免费桥接时,这样做是没有意义的。

具体问题

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

4

1 回答 1

1

简单地施放方块。

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

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);
    }

}
于 2015-10-29T10:55:16.587 回答