잠시 동안 수동 심판 계산, 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
또는)이 배열에 사용되었지만 동일한 배열의 요소에 사용 된 것 같습니다.
맞습니까? 다시 말하지만, 어디에서나 확인을 찾을 수는 없으므로 문서에서 설명서를 지정하는 위치를 알고 있으면 그에 대한 정보를 매우 감사하겠습니다. 감사.
// 편집 대답
을받은 후 나는 모두 CFArray
및 NSArray
자신의 요소를 유지 몰랐어요 - 그리고는 CF와 객체 세계에서 두 경우에, 그래서 아무것도 __bridge*
동안 변경할 수 없습니다. 전송 된 후 NSArray
은 ARC가 처리하며 어레이 자체가 해당 요소를 관리합니다. 따라서 ARC가 배열을 해제하면 배열은 요소를 해제합니다 (ARC는 요소에 대해 알 필요가 없습니다).
다리 지시어는 단순히 유지하고 방출에 상대적으로 무엇을해야하는지에 대한 정보와 ARC를 제공합니다. CFArray와 NSArray 모두에서 객체는 추가 될 때 유지되고 제거 될 때 해제되므로 ARC는 아무 것도하지 않습니다. 다리가 두 물체 이외의 다른 것에 영향을주는 경우는 생각할 수 없습니다. –