2011-11-06 4 views
2

이전 프로젝트의 일부 클래스를 새 프로젝트에 복사했습니다. 나는 모든 release/autorelease 문을 제거해야하지만, 난 여전히 몇 가지 오류가 : 나는 Expected identifier를 얻을 첫 번째 줄에서코드를 다시 사용할 때 예상되는 식별자 및 ARC 문제

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

합니다. 세 번째 줄에서는 implicit conversion of an Objective-C pointer to 'ABRecordRef (aka 'cpmnst void *)' is disallowed with ARC이 나옵니다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

+0

글쎄, 당신이있어 꽤 소란스러운 구문 오류가 첫 번째 줄에 :가 아닌 객체 유형 (ABRecordRef)에 해당 객체를 할당하고 있기 때문에, 당신은 간단한 다리 캐스트가 필요합니다. 두 번째 것에 대해 무엇을하려 했습니까? –

+0

ok 첫 번째 오류 수정 ...하지만 두 번째 오류를 수정하는 방법을 모릅니다. –

답변

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 person = (__bridge ABRecordRef)[allContacts objectAtIndex:i];