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

时间:2011-11-06 22:03:13

标签: 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];

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

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

1 个答案:

答案 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];