2012-02-23 6 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);