Iphone 记忆体泄漏

Iphone 记忆体泄漏,iphone,ios,abaddressbook,Iphone,Ios,Abaddressbook,我通过以下方法获得内存泄漏: - (void) SyncContactData { ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for( i

我通过以下方法获得内存泄漏:

- (void) SyncContactData
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

    for( int i = 0 ; i < nPeople ; i++ )
    {
        //dicContact = [[NSMutableDictionary alloc] init];

        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );
        NSString *str = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
        NSString *strSub = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
        int ii = [[NSString stringWithFormat:@"%@",strSub] length];
        if(str != nil || ii == 0)
            [arrNames addObject:strSub];
        else
            [arrNames addObject:@""];

        CFTypeRef multival = ABRecordCopyValue(ref, kABPersonPhoneProperty);
        NSArray *arrayPh = (NSArray *)ABMultiValueCopyArrayOfAllValues(multival);
        if([arrayPh count] > 0)
            [arrPhone addObject:[arrayPh objectAtIndex:0]];
        else
            [arrPhone addObject:@""];

        CFRelease(multival);

    }

    CFRelease(addressBook);
    CFRelease(allPeople);

}
-(无效)同步联系人数据
{
ABAddressBookRef addressBook=ABAddressBookCreate();
CFArrayRef allPeople=abAddressBookCopyArrayFallPeople(addressBook);
CFIndex nppeople=ABAddressBookGetPersonCount(地址簿);
for(int i=0;i0)
[arrPhone addObject:[arrayPh objectAtIndex:0]];
其他的
[arrPhone addObject:@”“;
cfl释放(多变量);
}
CFRelease(通讯录);
CFRelease(所有人);
}
这里有漏洞:

  • NSString*str=ABRecordCopyValue(ref,kabbersonfirstnameproperty)
  • NSString*strSub=ABRecordCopyValue(ref,kabbersonfirstnameproperty)
  • NSArray*arrayPh=(NSArray*)ab多值CopyArrayFallValues(多值)

  • 您需要释放处理完最初复制的对象:

    [str release];
    [strSub release];
    [arrayPh release];
    

    如果启用了ARC,您可能需要改用
    CFRelease
    (并适当地强制转换)。

    那么,为什么不释放它们呢

    CFRelease(str);
    CFRelease(strSub);
    CFRelease(arrayPh);