我将旧项目中的一些类复制到我的新项目中。我必须删除所有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
。
任何想法如何解决这个问题?
答案 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];