wie kann ich ein ABRecordRef zu einem NSMutableArray in iPhone?
Ich möchte ein array erstellen, die der ABRecordRef(s) zum speichern der Kontakte, die über eine gültige Geburtstags-Feld.
NSMutableArray* bContacts = [[NSMutableArray alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for( int i = 0 ; i < nPeople ; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );
NSDate* birthdayDate = (NSDate*) ABRecordCopyValue(ref, kABPersonBirthdayProperty);
if (birthdayDate != nil){
[bContacts addObject:ref];
}
}
Der compiler zeigt diese Warnung:
warning: passing argument 1 of 'addObject:' discards qualifiers from pointer target type
Ich suchte im web und festgestellt, ich habe zu werfen ABRecordRef zu einem ABRecord* zum speichern in einem NSMutableArray.
[bContacts addObject:(ABRecord*) ref];
Aber es scheint ABRecord ist nicht Teil der iOS-frameworks. Nun, wie ich speichern ABRecordRef zu NSMutableArray?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
ABRecordRef
ist ein typedef fürCFTypeRef
und das wiederum löstconst void *
. Und das ist, wo die Warnung kommt: mit dem AufrufaddObject:
, dieconst
Beiname ist "verloren".In diesem Fall wissen wir, es ist OK. Ein CFTypeRef ist ein semi-High-Level-Typ -, Instanzen dieses Typs unterstützen
CFRetain
undCFRelease
. Das wiederum bedeutet, es ist wahrscheinlich OK, um ihn zu wirken, umid
und behandeln es als ein NSObject. So sollten Sie einfach in der Lage zu tun:Erstellen Sie ein NSObject wich speichern Sie Ihre ABRecordRef wie diese :
Sie sollte einen Blick auf Erica Sadum-Bibliothek der Autor des iPhone-Kochbuch. Hier ist der code wich inspirieren diese code -> url
Ich weiß, das ist eine alte Frage, aber da die Einführung von ARC, ist dies in einer anderen Weise behandelt.
Gibt es zwei Möglichkeiten, das hinzufügen einer
ABRecordRef
zu einemNSMutableArray
jetzt, und beide erfordern eine bridged-Darsteller:Direkte Umwandlung
Diese einfach konvertiert die
ABRecordRef
Zeiger, und sollte verwendet werden, wenn Sie nichtref
sich mit einer Methode, dieCreate
im Namen.Übertragung von Eigenverantwortung ARC
Dieser wandelt die
ABRecordRef
Zeiger, und darüber hinaus überträgt Ihr Eigentum zu ARC. Dies sollte verwendet werden, wenn Sie z.B.ABPersonCreate()
zum erstellen einer neuen person.Mehr Informationen finden Sie in der Der übergang zum ARC Release Notes. Es gibt auch viele andere informative Quellen hier auf Stack Overflow, wie diese Frage.