Iphone 修复对象的潜在泄漏

Iphone 修复对象的潜在泄漏,iphone,objective-c,memory-management,addressbook,Iphone,Objective C,Memory Management,Addressbook,当我使用构建和分析时,我得到了泄漏(它显示为对象的潜在泄漏)。为了解决这个问题,我包括如下 if ( aContactfirstName){ CFRelease(aContactfirstName); } if (aContactLastName){ CFRelease(aContactLastName); } 但我的应用程序崩溃了 所以请让我知道它在哪里泄漏并解决它 -(NSString*)getContactNameByPhoneNo:(NSString*)phoneNO{

当我使用构建和分析时,我得到了泄漏(它显示为对象的潜在泄漏)。为了解决这个问题,我包括如下

if ( aContactfirstName){
  CFRelease(aContactfirstName);
  }
if (aContactLastName){
  CFRelease(aContactLastName);
  }
但我的应用程序崩溃了

所以请让我知道它在哪里泄漏并解决它

-(NSString*)getContactNameByPhoneNo:(NSString*)phoneNO{

      NSString *aContactName = phoneNO;
      ABAddressBookRef addressbook = ABAddressBookCreate();
      CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
      CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
      for (int i=0; i < numPeople; i++) { 
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
        ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty);
        CFIndex numPhones = ABMultiValueGetCount(phonelist);

        for (int j=0; j < numPhones; j++) {
          CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phonelist, j);
          NSString *personPhone = (NSString *)ABphone;
            NSLog(@"i am:");
          personPhone =[personPhone stringByReplacingOccurrencesOfString:@"-"withString:@""];
          personPhone=[personPhone stringByReplacingOccurrencesOfString:@")"withString:@""];
          personPhone=[personPhone stringByReplacingOccurrencesOfString:@" "withString:@""];
          personPhone=[personPhone stringByReplacingOccurrencesOfString:@"("withString:@""];
          personPhone=[personPhone stringByReplacingOccurrencesOfString:@"+"withString:@""];
            NSLog(@"xcxcxcxc");

          CFRelease(ABphone);

          if ( [personPhone isEqualToString:phoneNO] ){
            NSString *aContactfirstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) ;
            NSString *aContactLastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) ;
            if ( aContactLastName != NULL && aContactfirstName != NULL){
              aContactName = [NSString stringWithFormat:@"%@ %@",aContactfirstName,aContactLastName];
            }
            else if(aContactfirstName != NULL){
              aContactName = aContactfirstName;
            }
            else if(aContactLastName != NULL){
              aContactName = aContactLastName;
            }

              if ( aContactfirstName){
                CFRelease(aContactfirstName);
              }
              if (aContactLastName){
                CFRelease(aContactLastName);
              }

            break;
          }
        }
        CFRelease(phonelist);
      }
      CFRelease(allPeople);
      CFRelease(addressbook);
      return aContactName;
    }
-(NSString*)getContactNameByPhoneNo:(NSString*)phoneNO{
NSString*aContactName=phoneNO;
ABAddressBookRef addressbook=ABAddressBookCreate();
CFArrayRef allPeople=abAddressBookCopyArrayFallPeople(addressbook);
CFIndex numpople=ABAddressBookGetPersonCount(地址簿);
对于(inti=0;i
使用-

NSString *aContactfirstName = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease];
NSString *aContactLastName = [(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) autorelease];
在此过程中,您将aContactLastName分配给aContactName(aContactLastName和aContactName指向同一内存位置),然后释放aContactLastName

if (aContactLastName){
                CFRelease(aContactLastName);
              }
然后返回
return aContactName;
(aContactName已经发布) 这是错误的

除去

if (aContactLastName){
                CFRelease(aContactLastName);
              }

从您的代码返回
[aContactName autorelease];

非常感谢您提供的答案
if (aContactLastName){
                CFRelease(aContactLastName);
              }