Very small start to MVC refactor in iOS app
if (_phoneNumbers) {
    [_phoneNumbers removeAllObjects];
}

if (!_phoneNumbers) {
    //Create _phoneNumbers array
    _phoneNumbers = [[NSMutableArray alloc]init];
}


Instead of this, we can replace all these lines with simply:

_phoneNumbers = [NSMutableArray array];


The best advantage of this, is we don't run into any problems of emptying an array that someone else might have a reference to.  This could cause problems if, for example, you were using the phone numbers array as the data for a table view.  If you all of the sudden removed all the objects, but didn't call reloadData on the table view, the next time it tried grabbing a cell, it could be an index out of bounds.



ABMultiValueRef *phoneNumberRef = ABRecordCopyValue(_contactRef, kABPersonPhoneProperty);

NSString *phoneNumber = [[NSString alloc] init];

// Make sure multi value ref exists
if (phoneNumberRef) {
    CFIndex numberOfPhoneNumbers = ABMultiValueGetCount(phoneNumberRef);

    for (CFIndex i = 0; i &lt; numberOfPhoneNumbers; i++) {
        phoneNumber = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phoneNumberRef, i);
        CFStringRef label = ABMultiValueCopyLabelAtIndex(phoneNumberRef, i);
        if (label) {

        [_phoneNumbers addObject:phoneNumber];
            NSLog(@"phoneNumbers count in method: %d", _phoneNumbers.count);
        }
        CFRelease(label);
    }
    CFRelease(phoneNumberRef);
}


I think this section is problematic.  I don't know enough about AddressBook to really tell you for sure, so for now I'm just mentioning it and reserving a section for in the future if I come back and figure out what's wrong with it.  The CFRelease on phoneNumberRef seems particularly suspicious.



BOOL result = [self.addressBook requestAccess];

if (!result) {
    [self performSegueWithIdentifier:@"addFriendsToMediaCaptureSegue" sender:self];
}

if (result) {


This could and probably should be refactored into:

if (![self.addressBook requestAccess]) {
    [self performSegueWithIdentifier:@"addFriendsToMediaCaptureSegue" sender:self];
} else {


But... with that said, I did take a look at the requestAccess method in the link.  Strictly speaking, it's not in the question and so it's not strictly up for review, but, I'm quite certain it will always return NO, as the return is synchronous but the variable being returned is only set in an asynchronous block, and as such, will always be set too late.



int index2;
for (index2 = 0; index2 &lt; self.currentContact.phoneNumbers.count; index2++) {
    if (self.currentContact.firstName) {
        // Add current contact's phone number to array
        [self.potentiaFriendsPhoneNumberArray addObject:self.currentContact.phoneNumbers[index2]];

        // Add current contact's first name to array
        [self.potentiaFriendsNotInParseFirstNamesArray addObject:self.currentContact.firstName];
    }
}


First, we can declare our iterator variable in the for loop initialization statement.  Remember, you did this a few lines up.  But perhaps more importantly, why don't we use a forin?

for (id phoneNumber in self.currentContact.phoneNumbers) {
    [self.potentialFriendsPhoneNumberArray addObject:phoneNumber];
    [self.potentialFriendsNotInParseFirstNamesArray addObject:self.currentContact.firstName];
}


We should also move the if check outside the loop so that the entire loop can be circumvented in the case that we're never going to add anything anyway.  Embed the loop within the if.

Also, it doesn't make a ton of sense to me for there to be two separate arrays. I understand that you'll want a name associated with all the phone numbers, however it's better to do this with a single array, either by filling it with dictionaries with a key for the phone number and a key for the name, or by creating a custom object that will hold both of these parts.