ARC中CFArray的内存泄漏

Mar*_*ark 1 iphone cocoa memory-leaks automatic-ref-counting

我使用ARC制作了一个iPhone应用程序,可以访问地址簿中的每个条目,然后是每个人的每个地址.数据存储在CFArrays中,CFArrays是免费的桥接到NSArrays.代码如下.

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSArray *peopleArray =[(__bridge NSArray *) arrayRef copy];
CFRelease(arrayRef);
arrayRef = nil;

for(id personId in peopleArray)
{
    ABRecordRef person = (__bridge ABRecordRef) personId;
    //process other attributes of the address book

    ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonAddressProperty);
    CFArrayRef addressRef = ABMultiValueCopyArrayOfAllValues(multi);
    NSArray *addressArray = [(__bridge NSArray *) addressRef copy];

    for(NSDictionary *address in addressArray)
    {
       //process the addresses
    }
    CFRelease(addressRef);
    addressRef = nil;
}
Run Code Online (Sandbox Code Playgroud)

从我在互联网和Apple的内存管理指南中研究过,这看起来是正确的方法.问题是当我运行代码时,它停止在"CFRelease(addressRef)"上,突出显示绿色,文本"Thread 1"(不确定这个错误意味着什么).我也尝试在for循环之前放置CFRelease,但同样的问题也出现了.

如果我删除了CFRelease,它会编译,但是在创建addressArray时会出现内存泄漏.有谁知道如何解决这个问题?我似乎无法用ARC来解决这个问题.

Jen*_*ton 14

而不是NSArray *peopleArray =[(__bridge NSArray *) arrayRef copy]; CFRelease(arrayRef);,使用NSArray *peopleArray = CFBridgingRelease(arrayRef).这会将对象的所有权转移给ARC.