2013-12-12 3 views
2

잠시 동안 수동 심판 계산, ARC 및 CF 개체 작업을 했었지만 AddressBook API로 작업하는 동안 한 가지를 이해하지 못하고 (설명서에서 설명을 찾을 수 없음) 깨달았습니다.CFArrayRef에서 NSArray *로 __bridge_transfer가 전송 된 요소입니까?

여기 내 용도는 다음과 같습니다. ABRecordRef에서 ABMultiValueRef 속성을 복사하고 있습니다 (모든 요소를 ​​가져 오려면).

ABMultiValueRef multiString = ABRecordCopyValue(personRef, propertyID); 
NSArray* multiValues = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(multiString); 
CFRelease(multiString); 

//do something with the multiValues NSArray 

그래서 나는 CFArrayRef CFStringRef의의로 자신을 제시 형 kABMultiStringPropertyType의 특정 재산의 사본을 얻었다. 내가 올바르게 이해하면 배열에있는 CFStringRef과 그 자체 인 CFArrayRef을 공개해야 할 책임이 있습니다. (어쩌면 아닙니다, 그래서 제가 틀렸다면 알려주십시오).

CF 세계에서 CFArrayRef을 연결하고 소유권을 ARC로 이전 한 후 NSArray*이 ARC에서 처리된다는 것을 알고 있습니다. 그러나 그 배열 안의 CFStringRef은 어떨까요? 그것들은 NSString*에 연결되어 있습니다 (나는 for..in으로 요소를 반복 할 수 있기 때문에 알고 있습니다). 그러나 어떤 유형의 __bridge*이 적용되었는지 확실하지 않습니다.

이전에 경험하지 못했던 것에서는 __bridge* (__bridge 또는)이 배열에 사용되었지만 동일한 배열의 요소에 사용 된 것 같습니다.

맞습니까? 다시 말하지만, 어디에서나 확인을 찾을 수는 없으므로 문서에서 설명서를 지정하는 위치를 알고 있으면 그에 대한 정보를 매우 감사하겠습니다. 감사.

// 편집 대답

을받은 후 나는 모두 CFArrayNSArray 자신의 요소를 유지 몰랐어요 - 그리고는 CF와 객체 세계에서 두 경우에, 그래서 아무것도 __bridge* 동안 변경할 수 없습니다. 전송 된 후 NSArray은 ARC가 처리하며 어레이 자체가 해당 요소를 관리합니다. 따라서 ARC가 배열을 해제하면 배열은 요소를 해제합니다 (ARC는 요소에 대해 알 필요가 없습니다).

+0

다리 지시어는 단순히 유지하고 방출에 상대적으로 무엇을해야하는지에 대한 정보와 ARC를 제공합니다. CFArray와 NSArray 모두에서 객체는 추가 될 때 유지되고 제거 될 때 해제되므로 ARC는 아무 것도하지 않습니다. 다리가 두 물체 이외의 다른 것에 영향을주는 경우는 생각할 수 없습니다. –

답변

2

__bridge_transfer 또는 __bridge은 유형 캐스트이며 선택적 소유권 양도입니다. 배열 자체는 brigde에 의해 수정되지 않으며 배열 요소는 전혀 변경되지 않습니다.

따라서 배열 요소를 공개 할 책임이 없습니다. 배열은 배열에서 요소가 제거 될 때 요소 (ARC 말하기 : 강력한 참조를 유지)를 유지하고 요소를 해제합니다 ( 강력한 참조를 제거함). 명시 적으로 배열 요소의 소유권을 이전하는 경우

만 당신은 그것을 해제 책임이 있습니다 :

CFStringRef s = (__bridge_retain CFStringRef) multiValues[0]; 
// … 
CFRelease(s); 
+0

물론. 어떤 이유로 ARC가 배열을 해제 할 때 어레이가 요소를 유지해야한다는 것을 알지 못했습니다. 배열은 "수동으로"요소를 해제합니다.이것은 나의 질문, 감사를 설명한다. – czechboy