Вложенный мост передачи вызова с ARC
Я пытаюсь получить адрес электронной почты контакта и тип адреса электронной почты (рабочий / домашний). Это код, который я написал
//Assume that 'personRef' of type ABRecordRef is available
....
ABMultiValueRef emailRef = ABRecordCopyValue(personRef, kABPersonEmailProperty);
NSMutableArray *emailAddresses = nil, *emailAddressLabels = nil;
int ctr = ABMultiValueGetCount(emailRef);
if(ctr!=0) {
emailAddresses = [[NSMutableArray alloc]init];
emailAddressLabels = [[NSMutableArray alloc]init];
for(int i=0; i<ctr; i++) {
NSString *eId = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(emailRef, i);
[emailAddresses addObject:eId];
CFStringRef label = ABMultiValueCopyLabelAtIndex (emailRef, i);
if(label!=NULL) {
NSString *eType = (__bridge_transfer NSString*)ABAddressBookCopyLocalizedLabel(label);
if([eType isEqualToString:@""]) {
[emailAddressLabels addObject:@"Email"];
} else {
[emailAddressLabels addObject:eType];
}
CFRelease(label);
}
}
}
Код вылетает при CFRelease(метка), но для предотвращения утечки памяти я должен это делать. Когда я попробую следующее
NSString *eType = (__bridge_transfer NSString*) ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex (emailRef, i));
Я получаю следующее предупреждение от ARC
1. Call to function 'ABMultiValueCopyLabelAtIndex' returns a Core Foundation object with a +1 retain count
2. Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1
Теперь у меня вопрос: как сделать вложенный вызов __bridge_transfer?
1 ответ
NSString *eType = (__bridge_transfer NSString*)
ABAddressBookCopyLocalizedLabel(
ABMultiValueCopyLabelAtIndex (emailRef, i) /* <-- this object is leaked */
);
Этот код недействителен, потому что здесь вы пропускаете Метку (которая, как я понимаю, является вашей точкой зрения?).
Вы должны запустить этот код под инструментом Instruments NSZombie, он отследит все сохранения / выпуски, и вы поймете, что происходит, потому что, честно говоря, глядя на код, я не понимаю, почему это неправильно.