title: iPhone SDK: EXC_BAD_ACCESS with CFRelease for ABAddressBookRef
body: <p>there's very strange error with my code.. In fact, there's no errors at all, just debugger starts with "Program received signal:  “EXC_BAD_ACCESS”" message.
  Can anyone help me? I'm absolutely confused... Thank you.</p>
  
  <pre><code>-(NSString *)fullNameForPhone:(NSString *)ph withAlternativeText:(NSString *)text
  {
      ABAddressBookRef addressBookRef = ABAddressBookCreate(); 
      NSLog(@"create addressBookRef");
      NSString *stringToReturn = text;
  
      CFArrayRef allPeopleRef = ABAddressBookCopyArrayOfAllPeople(addressBookRef);  
      NSLog(@"create allPeopleRef");
      CFIndex nPeople = ABAddressBookGetPersonCount(addressBookRef);  
  
      int i = 0;
      BOOL nameFound = NO;
  
      while ((i &lt; nPeople) &amp;&amp; (!nameFound))
      {
          ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);
          NSLog(@"   create recordRef");
          CFStringRef allRecordPhonesRef = ABRecordCopyValue(recordRef, kABPersonPhoneProperty);
          NSLog(@"   create allRecordPhonesRef");
          CFIndex nPhones = ABMultiValueGetCount(allRecordPhonesRef);
          int currentPhone = 0;
          for (currentPhone = 0; currentPhone &lt; nPhones; currentPhone++) 
          {
              CFStringRef currentPhoneNumberRef = ABMultiValueCopyValueAtIndex(allRecordPhonesRef, currentPhone);
              NSLog(@"         create currentPhoneNumberRef");
              NSString *currentCleanPhoneNumber = [self cleanPhoneNumberForString:[NSString stringWithFormat:@"%@", currentPhoneNumberRef]];
              if (currentPhoneNumberRef!=NULL)
              {
                  NSLog(@"         release currentPhoneNumberRef");
                  CFRelease(currentPhoneNumberRef);
              }
  
              if ([ph isEqualToString:currentCleanPhoneNumber])
              {
                  CFStringRef firstName = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);
                  CFStringRef lastName = ABRecordCopyValue(recordRef, kABPersonLastNameProperty);
                  NSString *fullName = [self fullNameForFirstName:[NSString stringWithFormat:@"%@", firstName] 
                                                      andLastName:[NSString stringWithFormat:@"%@", lastName]];
                  if (firstName != NULL)
                      CFRelease(firstName);
                  if (lastName != NULL)
                      CFRelease(lastName);
                  stringToReturn = fullName;
                  nameFound = YES;
                  break;
              }
  
          }
  
          CFRelease(allRecordPhonesRef);
          NSLog(@"   release allRecordPhonesRef");
          CFRelease(recordRef);
          NSLog(@"   release recordRef");
          i++;
      }
      CFRelease(allPeopleRef);
      NSLog(@"release allPeopleRef");
      CFRelease(addressBookRef);
      NSLog(@"release addressBookRef");
      return stringToReturn;
  }
  </code></pre>
  
  <p>Console output is:</p>
  
  <pre><code>2009-07-31 00:20:05.230 abmodular[21747:20b] create addressBookRef
  2009-07-31 00:20:05.231 abmodular[21747:20b] create allPeopleRef
  2009-07-31 00:20:05.231 abmodular[21747:20b]    create recordRef
  2009-07-31 00:20:05.232 abmodular[21747:20b]    create allRecordPhonesRef
  2009-07-31 00:20:05.232 abmodular[21747:20b]          create currentPhoneNumberRef
  2009-07-31 00:20:05.232 abmodular[21747:20b]          release currentPhoneNumberRef
  2009-07-31 00:20:05.232 abmodular[21747:20b]          create currentPhoneNumberRef
  2009-07-31 00:20:05.233 abmodular[21747:20b]          release currentPhoneNumberRef
  2009-07-31 00:20:05.233 abmodular[21747:20b]    release allRecordPhonesRef
  2009-07-31 00:20:05.233 abmodular[21747:20b]    release recordRef
  2009-07-31 00:20:05.233 abmodular[21747:20b]    create recordRef
  2009-07-31 00:20:05.234 abmodular[21747:20b]    create allRecordPhonesRef
  2009-07-31 00:20:05.234 abmodular[21747:20b]          create currentPhoneNumberRef
  2009-07-31 00:20:05.234 abmodular[21747:20b]          release currentPhoneNumberRef
  2009-07-31 00:20:05.234 abmodular[21747:20b]    release allRecordPhonesRef
  2009-07-31 00:20:05.235 abmodular[21747:20b]    release recordRef
  2009-07-31 00:20:05.235 abmodular[21747:20b] release allPeopleRef
  [Session started at 2009-07-31 00:20:05 +0400.]
  GNU gdb 6.3.50-20050815 (Apple version gdb-966)
  ....
  Attaching to process 21747.
  kill
  quit
  The Debugger has exited with status 0.(gdb) 
  </code></pre>
  
  <p>Pressing Continue outputs "EXC_BAD_ACCESS" message. Xcode shows, that the latest executed string in my code was <code>CFRelease(addressBookRef);</code></p>