2015-10-28 30 views
2

是否可以將一個帶有免費橋接等價物的Objective-C類型的塊直接傳遞給一個預期帶有C類型塊的方法?ObjC使用免費橋接類型來建立一個塊

具體的例子

我包裹通訊錄和聯繫人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類型的對象鍵入void(^)(bool granted, CFErrorRef error)?如果可以的話,語法是什麼? ARC環境中所有權的含義是什麼?

回答

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

} 
+0

我從來沒有考慮過非橋接投,因爲我很害怕關於底層的內存管理。 「ARC環境中所有權的含義是什麼?」我是不是在過度複雜的問題。我猜所有的塊都是ObjC對象(讀取:id),不管它是否包含C或ObjC類型,所以內存管理並不重要。 –

相關問題