是否可以将具有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环境中所有权的含义是什么?
答案 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);
}
}