重用代码时出现预期的标识符和ARC问题

Upv*_*ote 2 objective-c xcode4.2 automatic-ref-counting

我将旧项目中的一些类复制到我的新项目中.我不得不删除所有release/autorelease语句,但我仍然有一些错误:

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

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

任何想法如何解决这一问题?

小智 6

考虑:

NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
Run Code Online (Sandbox Code Playgroud)

名称包含的函数Copy返回调用者拥有的引用,这意味着调用者必须释放它.在ARC下,释放是自动的,但您需要告诉ARC该函数返回的引用由调用者拥有,因为函数声明缺少该信息.这是所有权转移的一个示例,您应该__bridge_transfer在这种情况下使用:

NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
Run Code Online (Sandbox Code Playgroud)

在:

ABRecordRef person = [allContacts objectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)

-objectAtIndex:返回不属于调用者的对象.由于您要将该对象分配给非对象类型(ABRecordRef),因此您需要一个简单的桥接转换:

ABRecordRef person = (__bridge ABRecordRef)[allContacts objectAtIndex:i];
Run Code Online (Sandbox Code Playgroud)