[Obj-C, iOS] adresboek AABRecordSetValue pakt string niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Hallo,
ik wil voor een iphone-app gebruik maken van de standaard ABUnknownPersonViewController, om zo persoonsgegevens te tonen en evt. toe te kunnen voegen aan het adresboek in iOS. Ik gebruik de volgende code om bepaalde propertjes van de persoon te setten
code:
1
2
3
4
5
6
7
8
9
10
11
12
    ABRecordRef selectedPerson = ABPersonCreate();

    ABRecordSetValue(selectedPerson, kABPersonFirstNameProperty, (__bridge CFStringRef)[lid objectForKey:@"Voornaam "], NULL);
    ABRecordSetValue(selectedPerson, kABPersonLastNameProperty, (__bridge CFStringRef)[lid objectForKey:@"Achternaam "], NULL);
  //  ABRecordSetValue(selectedPerson, kABPersonPhoneProperty, (__bridge CFStringRef)[lid objectForKey:@"Mobiel"], NULL);
  //  ABRecordSetValue(selectedPerson, kABPersonEmailProperty, (__bridge CFStringRef)[lid objectForKey:@"Email"], NULL);


   // CFStringRef email = (__bridge CFStringRef)[lid objectForKey:@"Email"];
   // ABMutableMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABPersonEmailProperty);
   // ABMultiValueAddValueAndLabel(emailMultiValue, email, kABWorkLabel, nil);
   // ABRecordSetValue(selectedPerson, kABPersonEmailProperty, emailMultiValue, nil);


Nu gaat het goed zolang ik alleen first en last name set. Als ik ook de phone of email property wil setten krijg ik een 'exc_bad_access' error bij het pushen van de viewcontroller.

Nu heb ik ergens gevonden dat voor emailadressen en telefoonnummers zogeheten multiValueRef's gebruikt moeten worden. Dit is het tweede block code(uitgecomment hierboven). Als ik hierin de variabele 'email' vervang door @"test@test.nl" krijg ik geen fout en de correcte uitvoer. Als ik dit niet doe en het emailadres uit de dictionary haal, krijg ik wederom dezelfde error.

Heeft iemand ervaring met het adresboek in IOS? Ik kom er niet uit, en zou graag weten waarom het emailadres wel correct is als ik het als @"..." invoer, en niet als ik het uit een variabele haal.

Ik ben benieuwd.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Je geheugenmanagement is waarschijnlijk ergens gaar, te vaak een release oid gedaan. Dan krijg je inderdaad de exc_bad_access error's. Even inlezen over geheugenmanagement in Obj-C lijkt mij een goede tip :)

Of je gaat enkel voor iOS5 devven, dan kan je ARC gebruiken en is het geheugen management al een stuk makkelijker.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Ik maak gebruik van ARC, dan is het releases van objecten toch niet nodig (en zelfs niet toegestaan), toch?

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Dan moet dat idd niet, maar dan moet je alsnog aangeven op sommige plekken of je een strong of weak reference hebt naar het object. (Bij instance variabelen dacht ik zo)

Moet je even met breakpoints gaan werken en kijken waarom de waarde niet meer aanwezig is ofzo.

[ Voor 22% gewijzigd door ZpAz op 04-01-2012 14:36 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Inmiddels heb ik het bovenstaande aan de praat gekregen. De oorzaak lag hem wat betreft het email-adres in de verkeerde dictionary-key('Email ' ipv 'Email'). Bij het toevoegen van een telefoonnummer liep ik tegen hetzelfde probleem aan. Dit heb ik verholpen door
code:
1
    ABMutableMultiValueRef phoneNumberMultiValue =  ABMultiValueCreateMutable(kABMultiStringPropertyType);
te gebruiken in plaats van
code:
1
     ABMutableMultiValueRef phoneNumberMultiValue =  ABMultiValueCreateMutable(kABPersonPhoneProperty);


Wat betreft de weak en strong references, hier ga ik even naar kijken of dit in mijn geval nodig is. Momenteel krijg ik geen memory warnings/errors meer.

Bedankt ZpAz!