2009-05-25 3 views
0

Der folgende Code erstellt ein Array aller meiner Kontakte in meinem Adressbuch nach Vorname und Nachname. Das Problem ist, ich habe einen Kontakt, der immer mit einem leeren Vor- und Nachnamen auftaucht. Ich kann diesen Kontakt in meinem aktuellen Adressbuch nicht finden. Kann jemand vorschlagen, wie man das debuggt, um die Quelle des Geheimnisgeistkontakts herauszufinden?Leere Feld auf dem iPhone AddressBook, wie Debuggen?

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *peopleArray = (NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 
NSMutableArray *allNames = [NSMutableArray array]; 

for (id person in peopleArray) { 
    NSMutableString *firstName = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease]; 
    NSMutableString *lastName = [(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) autorelease]; 
    ABMutableMultiValueRef multiValueEmail = ABRecordCopyValue(person, kABPersonEmailProperty); 
    if (ABMultiValueGetCount(multiValueEmail) > 0) { 
     NSString *email = [(NSString *)ABMultiValueCopyValueAtIndex(multiValueEmail, 0) autorelease]; 
    } 

    if (![firstName length]) { 
    firstName = @""; 
    } 
    if (![lastName length]) lastName = @""; 

    [allNames addObject:[NSString stringWithFormat:@"%@ %@", firstName, lastName]]; 
} 

Der Personentyp ist vom Typ NSCFType. Ich könnte leicht etwas tun wie:

if (![lastName length] && ![firstName length]) continue; 

.. und mit dem Problem gemacht werden. Ich bin gespannt, welcher Eintrag in meinem Adressbuch als Geist erscheint. Ich habe versucht, das Objekt mit gdb zu untersuchen, kann aber nichts Wertvolles daraus ziehen.

Ich würde gerne alle Eigenschaften für Person sehen, aber derefreaming das Objekt zu (ABPerson *) scheint es nicht zu tun.

Ich habe auch versucht mit CFShow (Person), die es als Typ CPRecord enthüllt. Hier finden Sie jedoch keine weitere Dokumentation.

Gibt es etwas in gdb, das ich tun kann, um dieses bestimmte Personenobjekt weiter zu untersuchen, um zu sehen, woher die Quelle kommt?

+0

Sind irgendwelche dieser Eigenschaften als Rückkehr veränderbare Objekte deklariert? Ich verstehe nicht, warum Sie dort Namen von veränderbaren Objektklassen verwenden. Sind Sie auch sicher, firstName und lastName sind leer und nicht null? Sie ersetzen nil am Ende der Schleife durch leer; Haben Sie die Variablen vor oder nach dieser Substitution untersucht? –

+0

Hallo Peter, ich ersetze sie mit leer, wenn sie Null sind, sonst bekomme ich etwas wie Joe (null) in meiner Ausgabe. Wenn es einen besseren Ansatz gibt, würde ich es gerne hören. Deshalb habe ich sie als veränderbare Objekte deklariert. Wenn es eine bessere Möglichkeit gibt, dies zu schreiben, würde ich gerne lernen. – Coocoo4Cocoa

Antwort

1

Der Eintrag wird wahrscheinlich als Organisationsdatensatz und nicht als Personendatensatz gekennzeichnet. In diesem Fall müssen Sie den Namen der Organisation und nicht den Vor- und Nachnamen herausziehen.

Versuchen bei den Eigenschaften suchen:

kABPersonOrganizationProperty, kABPersonKindProperty 
+0

Klingt so, könnte das Problem sein, ich vermute den Apple Computer Standardeintrag. Irgendeine Idee, wie ich die Personenvariable in gdb untersuchen kann, um seinen vollen Inhalt im Gedächtnis zu sehen? – Coocoo4Cocoa

1

IT ist wahrscheinlich ein Kontakt, der nur eine Organisation ist

versuchen an diesen Eigenschaften suchen

Diese Konstanten implementieren, um die Person Eigenschaft type (Eine Eigenschaft von Typ KABIntegerPropertyType), die angibt, ob eine Person Datensatz darstellt ein menschliches Wesen oder eine Organisation.

 const ABPropertyID kABPersonKindProperty; 
    const CFNumberRef kABPersonKindPerson; 
    const CFNumberRef kABPersonKindOrganization;