2011-11-06 49 views
2

我從舊項目中將一些類複製到我的新項目中。我不得不刪除所有release/autorelease聲明,但我仍然有一些錯誤:重複使用代碼時預期的標識符和ARC問題

NSArray *allContacts = [(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook)]; 
    for (int i =0; i < allContacts.count; i++) { 
     ABRecordRef person = [allContacts objectAtIndex:i]; 

在第一行中,我得到Expected identifier。在第三行我得到implicit conversion of an Objective-C pointer to 'ABRecordRef (aka 'cpmnst void *)' is disallowed with ARC

任何想法如何解決這一問題?

+0

嗯,你已經有了一個非常赤裸裸的語法錯誤的第一行。你對第二個有什麼想法? –

+0

確定第一個...但我不知道如何解決第二個錯誤 –

回答

6

考慮:

NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 

函數的名稱包含Copy返回年代由主叫方,這意味着調用者必須釋放它擁有的參考。在ARC下,釋放是自動的,但您需要告訴ARC該函數返回的引用由調用者擁有,因爲函數聲明缺少該信息。這是所有權轉移的一個例子,你應該在這種情況下使用__bridge_transfer

NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 

在:

ABRecordRef person = [allContacts objectAtIndex:i]; 

-objectAtIndex:返回不是由主叫方所擁有的對象。既然你要指定該對象非對象類型(ABRecordRef),你需要一個簡單的橋鑄:

ABRecordRef person = (__bridge ABRecordRef)[allContacts objectAtIndex:i];