ios - Why does my app crash when I try to access a contact’s name? -


my app asks users select 1 of contacts , 1 of contact’s addresses. want generate “display name” use refer address: example, if user selects 1 of john smith’s addresses, display name “john smith” , ui refer address “john smith’s address”. algorithm extracting name address record follows:

  1. if contact business, use business’s name.
  2. if there first name , last name, use “firstname lastname”.
  3. if there first name use first name.
  4. if there last name use last name.
  5. use string “selected contact”.

i have logic implemented. problem see crashes (kern_invalid_address) on 1 of 2 marked lines. app uses arc, , don’t have lot of experience core foundation, assume i’m doing memory management or bridging incorrectly. can tell me i’m doing wrong, , how fix crashes? relevant 2 methods follows:

- (bool) peoplepickernavigationcontroller:(abpeoplepickernavigationcontroller *)peoplepicker        shouldcontinueafterselectingperson:(abrecordref) person                                  property:(abpropertyid) property                                identifier:(abmultivalueidentifier) identifier {     [self dismissviewcontrolleranimated:yes completion:null];      cftyperef address = abrecordcopyvalue(person, property);     nsarray *addressarray = (__bridge_transfer nsarray *)abmultivaluecopyarrayofallvalues(address);     cfrelease(address);     nsdictionary *addressdict = [addressarray objectatindex:0];      clgeocoder *geocoder = [[clgeocoder alloc] init];     [geocoder geocodeaddressdictionary:addressdict completionhandler:^(nsarray *placemarks, nserror *error) {         if (error || !placemarks || [placemarks count] == 0) {             // tell user there error         } else {             nsstring *name = contactname(person);             nsstring *addressname = [nsstring stringwithformat:@"%@’s address", name];             // use `addressname` refer address user         }     }];      return no; }  nsstring* contactname(abrecordref person) {     nsstring *name;      // crashes occur on line:     cfnumberref contacttype = abrecordcopyvalue(person, kabpersonkindproperty);      if (contacttype == kabpersonkindorganization)         name = (__bridge_transfer nsstring *)abrecordcopyvalue(person, kabpersonorganizationproperty);      if (!name || [name length] == 0 || contacttype == kabpersonkindperson) {         // other crashes occur on line:         nsstring *firstname = (__bridge_transfer nsstring *)abrecordcopyvalue(person, kabpersonfirstnameproperty);         nsstring *lastname = (__bridge_transfer nsstring *)abrecordcopyvalue(person, kabpersonlastnameproperty);          if (firstname && [firstname length] > 0 && lastname && [lastname length] > 0)             name = [nsstring stringwithformat:@"%@ %@", firstname, lastname];         else if (firstname && [firstname length] > 0)             name = firstname;         else if (lastname && [lastname length] > 0)             name = lastname;          if (!name || [name length] == 0)             name = @"selected contact";     }      cfrelease(contacttype);      return name; } 

assuming call dismissviewcontrolleranimated:completion: dismissing people picker controller, , person object retained controller, person deallocated before finished processing it. merely moving dismissviewcontrolleranimated:completion: call end of method should fix problem. if processing causes of delay before dismissing view controller, copy person value variable arc retain you, dismiss view controller, process person.


Comments

Popular posts from this blog

.htaccess - First slash is removed after domain when entering a webpage in the browser -

Automatically create pages in phpfox -

c# - Farseer ContactListener is not working -