2012-02-23 63 views
0

我得到的內存泄漏下面的方法:這裏內存泄漏ABAdressbook

- (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); 

} 

獲取泄漏:

  1. NSString *str = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
  2. NSString *strSub = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
  3. NSArray *arrayPh = (NSArray *)ABMultiValueCopyArrayOfAllValues(multival);

回答

0

你需要釋放原本複製當你與他們所做的對象:

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

如果ARC已啓用,您可能需要使用CFRelease代替(並適當地投)。

0

那麼,爲什麼不公佈它們呢?

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