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:
- if contact business, use business’s name.
- if there first name , last name, use “firstname lastname”.
- if there first name use first name.
- if there last name use last name.
- 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
Post a Comment