ObjC使用免费桥接类型转换块

时间:2015-10-28 17:55:38

标签: objective-c automatic-ref-counting toll-free-bridging

是否可以将具有Toll-free-bridged等价物的Objective-C类型的块直接传递给期望具有C类型的块的方法?

具体示例

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

CNContactStore的{​​{1}}

- (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler的{​​{1}}

我有一个AddressBook类型的块,如果我可以将其传递给void ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );,那就太棒了。我知道我可以将我的'objc'块包装在一个以“C类型”作为参数的块中,但是当类型是免费的可桥接时,这样做是毫无意义的。

具体问题

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

1 个答案:

答案 0 :(得分: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);
    }

}